Mutex和Event是系统内核对象,好处是他们是跨进程的,可以用作进程间的线程同步。缺点也很明显,就是他们的速度较慢。 Critical Section则是用户对象,速度快,但是不能设置超时时间,一不小心会造成死锁。(记得操作系统课本上的哲学家饿死问题吗,幸好哲学家不搞程序,要不然非气吐血不可)。。。 一个很简单的Critical Section示例:
// Coding by nyzhl with Visual C++ 6.0
#include <windows.h>
#include <stdio.h>
//Definition of Critical Section object
CRITICAL_SECTION g_cs;
//Definition of Thread Processors
DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
int g_count = 100;
void main()
{
//Initialization
InitializeCriticalSection(&g_cs);
HANDLE thread1 = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
CloseHandle(thread1);
HANDLE thread2 = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
CloseHandle(thread2);
Sleep(5000);
//Free resources of critical section
DeleteCriticalSection(&g_cs);
}
//Implementation of Thread Processors
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
while(true)
{
//*********Critical Section*************
EnterCriticalSection(&g_cs);
if(g_count<1) break;
Sleep(1);
printf("%d/n",g_count);
g_count--;
LeaveCriticalSection(&g_cs);
//****************************************
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
while(true)
{
//************Critical Section************
EnterCriticalSection(&g_cs);
if(g_count<1) break;
Sleep(1);
printf("%d/n",g_count);
g_count--;
LeaveCriticalSection(&g_cs);
//*****************************************
}
return 0;
}