秒殺多線程-事件Event
推薦閱讀:


事件Event實際上是個內(nèi)核對象,它的使用非常方便。
CreateEvent()
函數(shù)功能:創(chuàng)建事件函數(shù)原型:
函數(shù)說明:
第一個參數(shù)表示安全控制,一般直接傳入NULL。
第二個參數(shù)確定事件是手動置位還是自動置位,傳入TRUE表示手動置位,傳入FALSE表示自動置位。如果為自動置位,則對該事件調(diào)用WaitForSingleObject()
后會自動調(diào)用ResetEvent()
使事件變成未觸發(fā)狀態(tài)。打個小小比方,手動置位事件相當于教室門,教室門一旦打開(被觸發(fā)),所有人都可以進入直到老師去關(guān)上教室門(事件變成未觸發(fā))。自動置位事件就相當于醫(yī)院里拍X光的房間門,門打開后只能進入一個人,這個人進去后會將門關(guān)上,其它人不能進入除非門重新被打開(事件重新被觸發(fā))。
第三個參數(shù)表示事件的初始狀態(tài),傳入TRUR表示已觸發(fā)。第四個參數(shù)表示事件的名稱,傳入NULL表示匿名事件。
OpenEvent()
函數(shù)功能:根據(jù)名稱獲得一個事件句柄。函數(shù)原型:
函數(shù)說明:
第一個參數(shù)表示訪問權(quán)限,對事件一般傳入EVENT_ALL_ACCESS。詳細解釋可以查看MSDN文檔。
第二個參數(shù)表示事件句柄繼承性,一般傳入TRUE即可。
第三個參數(shù)表示名稱,不同進程中的各線程可以通過名稱來確保它們訪問同一個事件。
SetEvent()
函數(shù)功能:觸發(fā)事件函數(shù)原型:
函數(shù)說明:每次觸發(fā)后,必有一個或多個處于等待狀態(tài)下的線程變成可調(diào)度狀態(tài)。
ResetEvent()
函數(shù)功能:將事件設(shè)為末觸發(fā)
函數(shù)原型:
函數(shù)說明:將指定的事件對象設(shè)置為非信號狀態(tài)。
最后一個事件的清理與銷毀由于事件是內(nèi)核對象,因此使用CloseHandle()
就可以完成清理與銷毀了。
修改代碼

經(jīng)典線線程同步問題已經(jīng)圓滿的解決了——線程編號的輸出沒有重復(fù),說明主線程與子線程達到了同步。全局資源的輸出是遞增的,說明各子線程已經(jīng)互斥的訪問和輸出該全局資源。
繼續(xù)深挖下事件Event
接下來再繼續(xù)深挖下事件Event,看看它還有什么秘密沒。
PulseEvent()
函數(shù)功能:將事件觸發(fā)后立即將事件設(shè)置為未觸發(fā),相當于觸發(fā)一個事件脈沖。
函數(shù)原型:
函數(shù)說明:這是一個不常用的事件函數(shù),此函數(shù)相當于SetEvent()
后立即調(diào)用ResetEvent()
;此時情況可以分為兩種:
1.對于手動置位事件,所有正處于等待狀態(tài)下線程都變成可調(diào)度狀態(tài)。
2.對于自動置位事件,所有正處于等待狀態(tài)下線程只有一個變成可調(diào)度狀態(tài)。
此后事件是末觸發(fā)的。該函數(shù)不穩(wěn)定,因為無法預(yù)知在調(diào)用PulseEvent ()時哪些線程正處于等待狀態(tài)。
寫一個例子,主線程啟動7個子線程,其中有5個線程Sleep(10)
后對一事件調(diào)用等待函數(shù)(稱為快線程),另有2個線程Sleep(100)
后也對該事件調(diào)用等待函數(shù)(稱為慢線程)。主線程啟動所有子線程后再Sleep(50)
保證有5個快線程都正處于等待狀態(tài)中。此時若主線程觸發(fā)一個事件脈沖,那么對于手動置位事件,這5個線程都將順利執(zhí)行下去。對于自動置位事件,這5個線程中只有一個順利執(zhí)行下去。而不論手動置位事件還是自動置位事件,那2個慢線程由于Sleep(100)
所以會錯過事件脈沖,因此慢線程都會進入等待狀態(tài)而無法順利執(zhí)行下去。
自動置位

手動置位

總結(jié)事件Event
1.事件是內(nèi)核對象,事件分為手動置位事件和自動置位事件。事件Event內(nèi)部它包含一個使用計數(shù)(所有內(nèi)核對象都有),一個布爾值表示是手動置位事件還是自動置位事件,另一個布爾值用來表示事件有無觸發(fā)。
2.事件可以由SetEvent()
來觸發(fā),由ResetEvent()
來設(shè)成未觸發(fā)。還可以由PulseEvent()
來發(fā)出一個事件脈沖。
3.事件可以解決線程間同步問題,因此也能解決互斥(一種特殊的同步)問題。
下一篇將介紹互斥量Mutex
參考:https://blog.csdn.net/morewindows/article/details/7445233