Thread是很常用的並行處理方法,為的是不讓主程式在特定時候被Hang住,不過一旦thread開啟了很多,彼此又有一些情況如果有關同步,沒有控制好,就可能會造成資料有問題。比方說(AB分別代表2個thread):
- B要使用A處理完的結果,所以要等A
- AB都共用一個資料,但此資料同時只能有一方存取
在Windows底下,Event是最簡單的同步方法,完全由User手動來控制決定。設定的函數有:
- CreateEvent:建立一個事件
- SetEvent:觸發這個事件,使其有信號,通常表示事件完成了。
- ResetEvent:把這個事件設成無信號,未被觸發狀態。
那我們怎麼實現共用呢?就用WaitForSingleObject()函數。
DWORD WINAPI Thread1(LPVOID lParam){
WaitForSingleObject(hEvent2,INFINITE);//等待event2完成
ResetEvent(hEvent2);
//作一些事情
SetEvent(hEvent1);//設定event1完成
return 0;
}
DWORD WINAPI Thread2(LPVOID lParam){
WaitForSingleObject(hEvent1,INFINITE);//等待event1完成
ResetEvent(hEvent1);
//作一些事情
SetEvent(hEvent2);//設定event2完成
return 0;
}
void main(){
hEvent1 = CreateEvent(NULL,TRUE,FALSE,"Event1");
hEvent2 = CreateEvent(NULL,TRUE,FALSE,"Event2");
SetEvent(hEvent1);
SetEvent(hEvent2);
hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&Thread1,NULL,0,0);
hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&Thread2,NULL,0,0);
}
好像,就是這樣而已。
參考這一篇的。
0 意見:
張貼留言