您的位置:首页 > 编程语言

-【用户方式线程同步】关键代码段

2011-08-26 13:24 253 查看
关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权。

下面是个有问题的代码,它显示了不使用关键代码段会发生什么情况:

const int MAX_TIMES = 1000;

int g_nIndex = 0;

DWORD g_dwTimes[MAX_TIMES];



DWORD WINAPI FirstThread(PVOID pvParam)

{

while(g_nIndex < MAX_TIMES)

{

g_dwTimes[g_nIndex] = GetTickCount();

g_nIndex++;

}

return(0);

}





DWORD WINAPI SecondThread(PVOID pvParam)

{

while(g_nIndex < MAX_TIMES)

{

g_nIndex++;

g_dwTimes[g_nIndex - 1] = GetTickCount();

}

return(0);

}

上面的代码存在一个问题,那就是g_dwTimes不会被正确地填入数据,因为两个线程函数要同时访问相同的全局变量。

const int MAX_TIMES = 1000;

int g_nIndex = 0;

DWORD g_dwTimes[MAX_TIMES];

CRITICAL_SECTION g_cs;



DWORD WINAPI FirstThread(PVOID pvParam)

{

while(g_nIndex < MAX_TIMES)

{

EnterCriticalSection(&g_cs);

g_dwTimes[g_nIndex] = GetTickCount();

g_nIndex++;

LeaveCriticalSection(&g_cs);

}

return(0);

}





DWORD WINAPI SecondThread(PVOID pvParam)

{

while(g_nIndex < MAX_TIMES)

{

EnterCriticalSection(&g_cs);

g_nIndex++;

g_dwTimes[g_nIndex - 1] = GetTickCount();

LeaveCriticalSection(&g_cs);

}

return(0);

}

这里指定了一个CRITICAL_SECTION数据结构g_cs,然后在对EnterCriticalSection和Lea veCriticalSection函数调用中封装了要接触共享资源(在这个例子中为g_nIndex和g_dwTimes)的任何代码。



注意:编写的需要使用共享资源的任何代码都必须封装在EnterCriticalSection和LeaveCriticalSection函数中。



当无法用互锁函数来解决同步问题时,你应该试用关键代码段。

关键代码段的优点

它们的使用非常容易,它们在内部使用互锁函数,这样它们就能够迅速运行。

关键代码的主要缺点

无法用它们对多个进程中的各个线程进行同步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: