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 意見:
張貼留言