1.用事件对象来控制线程
适用范围:多用于线程间的通信,可以跨进程同步。
//Define thread function
DWORD __stdcall ThreadFunOne(LPVOID lParam)
{
for(;;)
{
WaitForSingleObject(hEvent, INFINITE); //阻塞线程,直到事件对象为通知状态
if (WorkerID<MAXWORKERID)
{
WorkerID +=1;
Sleep(1000);
printf("ThreadOne print out: %i /n",WorkerID);
}
SetEvent(hEvent); //设置事件为通知状态
}
return 0;
}
DWORD __stdcall ThreadFunTwo(LPVOID lParam)
{
for(;;)
{
WaitForSingleObject(hEvent, INFINITE);
if (WorkerID<MAXWORKERID)
{
WorkerID +=1;
printf("ThreadTwo print out: %i /n",WorkerID);
Sleep(1000);
}
SetEvent(hEvent);
}
return 0;
}
void main()
{
//Define thread handle
HANDLE hThread1,hThread2;
hEvent = CreateEvent(NULL, FALSE, TRUE, "Event");
//Create thread
hThread1 = ::CreateThread(NULL,0,ThreadFunOne,NULL,0,NULL);
hThread2 = ::CreateThread(NULL,0,ThreadFunTwo,NULL,0,NULL);
//Close thread handle
CloseHandle(hThread1);
CloseHandle(hThread2);
//Note: Prevent process exiting
while (true)
{
;
}
}
2.用临界区来控制线程
适用范围:它只能同步一个进程中的线程,不能跨进程同步。一般用它来做单个进程内的代码快同步,效率比较高。
CRITICAL_SECTION Section;
DWORD __stdcall ThreadFunOne(LPVOID lParam)
{
for(;;)
{
EnterCriticalSection(&Section);
if (WorkerID<MAXWORKERID)
{
WorkerID +=1;
Sleep(1000);
printf("ThreadOne print out: %i /n",WorkerID);
}
LeaveCriticalSection(&Section);
}
return 0;
}
DWORD __stdcall ThreadFunTwo(LPVOID lParam)
{
for(;;)
{
EnterCriticalSection(&Section);
if (WorkerID<MAXWORKERID)
{
WorkerID +=1;
printf("ThreadTwo print out: %i /n",WorkerID);
Sleep(1000);
}
LeaveCriticalSection(&Section);
}
return 0;
}
void main()
{
//Define thread handle
HANDLE hThread1,hThread2;
InitializeCriticalSection(&Section);
//Create thread
hThread1 = ::CreateThread(NULL,0,ThreadFunOne,NULL,0,NULL);
hThread2 = ::CreateThread(NULL,0,ThreadFunTwo,NULL,0,NULL);
//Close thread handle
CloseHandle(hThread1);
CloseHandle(hThread2);
//Note: Prevent process exiting
while (true)
{
;
}
}
3.用互斥来控制线程
适用范围:可以跨进程同步,还可以用来保证程序只有一个实例运行(创建命名互斥量),也可以用来做线程间的同步
DWORD __stdcall ThreadFunOne(LPVOID lParam)
{
for(;;)
{
WaitForSingleObject(hMutex, INFINITE);
if (WorkerID<MAXWORKERID)
{
WorkerID +=1;
Sleep(1000);
printf("ThreadOne print out: %i /n",WorkerID);
}
ReleaseMutex(hMutex);
}
return 0;
}
DWORD __stdcall ThreadFunTwo(LPVOID lParam)
{
for(;;)
{
WaitForSingleObject(hMutex, INFINITE);
if (WorkerID<MAXWORKERID)
{
WorkerID +=1;
printf("ThreadTwo print out: %i /n",WorkerID);
Sleep(1000);
}
ReleaseMutex(hMutex);
}
return 0;
}
void main()
{
//Define thread handle
HANDLE hThread1,hThread2;
hMutex = CreateMutex(NULL, FALSE, "mutex");
//Create thread
hThread1 = ::CreateThread(NULL,0,ThreadFunOne,NULL,0,NULL);
hThread2 = ::CreateThread(NULL,0,ThreadFunTwo,NULL,0,NULL);
//Close thread handle
CloseHandle(hThread1);
CloseHandle(hThread2);
//Note: Prevent process exiting
while (true)
{
;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yunboy4/archive/2009/07/26/4380797.aspx