第九章 利用內(nèi)核對象同步線程
內(nèi)核對象可用于不同進程間線程的同步。
1.Wait系列函數(shù)
WaitForSingleObject
掛起當前線程,直到該函數(shù)返回。(被等待的對象處于Signal狀態(tài)或等待超時)
若有多個線程調(diào)用該函數(shù)等待同一個內(nèi)核對象,那么當這個內(nèi)核對象處于Signal狀態(tài)時只有一個線程會被喚醒。
若線程中有創(chuàng)建Windows的代碼,需要用MsgWaitForMultipleObjects代替WaitForSingleObject,否則會產(chǎn)生死鎖。
WaitForMultipleObjects
若需要同時等待多個內(nèi)核對象,則可以調(diào)用該函數(shù)
2.事件內(nèi)核對象
自動事件
當事件處于Signal狀態(tài)時,只有一個等待該事件的線程會被喚醒。 之后事件會被自動回到Non Signal狀態(tài)。
手動事件
當事件處于Signal狀態(tài)時,所有等待該事件的線程都會被喚醒。 之后需要調(diào)用ResetEvent把Event對象調(diào)回到Non Signal狀態(tài)。
3.信號量對象
信號量可以控制可以運行的線程的數(shù)量。
在創(chuàng)建信號量對象時要用一個初值來初始化lMaximumCount(允許運行線程數(shù)目的最大值),并把lInitialCount的值賦給CurrentSource
信號量內(nèi)部用CurrentSource來記錄當前可運行線程的數(shù)量,。
當CurrentSource大于0時,信號量處于Signal狀態(tài)。
當CurrentSource=0時,信號量處于Non Signal狀態(tài)。
WaitForSingleObject會使CurrentSource減1, ReleaseSemaphore會使CurrentSource+1.
4.互斥鎖
WAIT_ABANDONED
在Windows中使用互斥鎖可以有效的避免死鎖。
當持有Mutex的線程在調(diào)用ReleaseMutex前意外退出,如ExitThread和TerminateThread。系統(tǒng)會把Mutex分給等待Mutex的線程中的一個并返回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)系客服