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