第九章 利用內核對象同步線(xiàn)程
內核對象可用于不同進(jìn)程間線(xiàn)程的同步。
1.Wait系列函數
WaitForSingleObject
掛起當前線(xiàn)程,直到該函數返回。(被等待的對象處于Signal狀態(tài)或等待超時(shí))
若有多個(gè)線(xiàn)程調用該函數等待同一個(gè)內核對象,那么當這個(gè)內核對象處于Signal狀態(tài)時(shí)只有一個(gè)線(xiàn)程會(huì )被喚醒。
若線(xiàn)程中有創(chuàng )建Windows的代碼,需要用MsgWaitForMultipleObjects代替WaitForSingleObject,否則會(huì )產(chǎn)生死鎖。
WaitForMultipleObjects
若需要同時(shí)等待多個(gè)內核對象,則可以調用該函數
2.事件內核對象
自動(dòng)事件
當事件處于Signal狀態(tài)時(shí),只有一個(gè)等待該事件的線(xiàn)程會(huì )被喚醒。 之后事件會(huì )被自動(dòng)回到Non Signal狀態(tài)。
手動(dòng)事件
當事件處于Signal狀態(tài)時(shí),所有等待該事件的線(xiàn)程都會(huì )被喚醒。 之后需要調用ResetEvent把Event對象調回到Non Signal狀態(tài)。
3.信號量對象
信號量可以控制可以運行的線(xiàn)程的數量。
在創(chuàng )建信號量對象時(shí)要用一個(gè)初值來(lái)初始化lMaximumCount(允許運行線(xiàn)程數目的最大值),并把lInitialCount的值賦給CurrentSource
信號量?jì)炔坑?/span>CurrentSource來(lái)記錄當前可運行線(xiàn)程的數量,。
當CurrentSource大于0時(shí),信號量處于Signal狀態(tài)。
當CurrentSource=0時(shí),信號量處于Non Signal狀態(tài)。
WaitForSingleObject會(huì )使CurrentSource減1, ReleaseSemaphore會(huì )使CurrentSource+1.
4.互斥鎖
WAIT_ABANDONED
在Windows中使用互斥鎖可以有效的避免死鎖。
當持有Mutex的線(xiàn)程在調用ReleaseMutex前意外退出,如ExitThread和TerminateThread。系統會(huì )把Mutex分給等待Mutex的線(xiàn)程中的一個(gè)并返回Wait_Abandoned,從而避免了死鎖。
5. 其它同步方法
Asynchronous Device I/O
WaitForInputIdle
MsgWaitForMultipleObjects(Ex)
WaitForDebugEvent
SignalObjectAndWait
Detecting Deadlocks with the Wait Chain Traversal API
6.Common API:
WaitForSingleObject WaitForMultipleObjects
MsgWaitForMultipleObjects
CreateEvent CreateEventEx SetEvent ResetEvent OpenEvent
CreateSemaphore OpenSemaphore
CreateMutex OpenMutex ReleaseMutex
聯(lián)系客服