前面的一個帖子說了如何實現線程的同步,利用的是信號量來實現,關鍵的函數是:CreateMutex和ReleaseMutex函數。
下面,看看事件方式如何實現同步吧!
代碼:
#include <windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI Fun1Proc(LPVOID param);
DWORD WINAPI Fun2Proc(LPVOID Param);

int time;
HANDLE events;

void main()


{
HANDLE thread1,thread2;
thread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
thread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(thread1);
CloseHandle(thread2);
events = CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(events);
Sleep(4000);
CloseHandle(events);
}
DWORD WINAPI Fun1Proc(LPVOID param)


{

while(1)
{
WaitForSingleObject(events,INFINITE);

if(time <= 20)
{
Sleep(1);
cout << "線程1運行第" << time++ << "次" << endl;
}
else
break;
SetEvent(events);
}
return 0;
}

DWORD WINAPI Fun2Proc(LPVOID param)


{

while(1)
{
WaitForSingleObject(events,INFINITE);

if(time <= 20)
{
Sleep(1);
cout << "線程2運行第" << time++ << "次" << endl;
}
else
break;
SetEvent(events);
}
return 0;
}
從代碼上可以看到,除了對應的函數不同以外,其他的方式都是相同的,即:
對應的函數從CreateMutex變成了CreateEvent,而釋放資源則由ReleaseMutex變為SetEvent了。
效果相同,輸出都是:
線程1運行第0次
線程2運行第1次
線程1運行第2次
線程2運行第3次
線程1運行第4次
線程2運行第5次
線程1運行第6次
線程2運行第7次
線程1運行第8次
線程2運行第9次
線程1運行第10次
線程2運行第11次
線程1運行第12次
線程2運行第13次
線程1運行第14次
線程2運行第15次
線程1運行第16次
線程2運行第17次
線程1運行第18次
線程2運行第19次
線程1運行第20次
Press any key to continue
posted on 2010-02-09 18:54
deercoder 閱讀(1056)
評論(0) 編輯 收藏 引用