核心對象可用於不同進程間線程的同步。
1.Wait系列函數
WaitForSingleObject
掛起當前線程,直到該函數返回。(被等待的對象處於Signal狀態或等待逾時)
若有多個線程調用該函數等待同一個核心對象,那麼當這個核心對象處於Signal狀態時只有一個線程會被喚醒。
若線程中有建立Windows的代碼,需要用MsgWaitForMultipleObjects代替WaitForSingleObject,否則會產生死結。
WaitForMultipleObjects
若需要同時等待多個核心對象,則可以調用該函數
2.事件核心對象
自動事件
當事件處於Signal狀態時,只有一個等待該事件的線程會被喚醒。 之後事件會被自動回到Non Signal狀態。
手動事件
當事件處於Signal狀態時,所有等待該事件的線程都會被喚醒。 之後需要調用ResetEvent把Event對象調回到Non Signal狀態。
3.訊號量對象
訊號量可以控制可以時啟動並執行線程的數量。
在建立訊號量對象時要用一個初值來初始化lMaximumCount(允許運行線程數目的最大值),並把lInitialCount的值賦給CurrentSource
訊號量內部用CurrentSource來記錄當前可運行線程的數量,。
當CurrentSource大於0時,訊號量處於Signal狀態。當CurrentSource=0時
當CurrentSource=0時,訊號量處於Non Signal狀態。
WaitForSingleObject會使CurrentSource減1, ReleaseSemaphore會使CurrentSource+1.
4.互斥鎖
WAIT_ABANDONED
在Windows中使用互斥鎖可以有效避免死結。
當持有Mutex的線程在調用ReleaseMutex前意外退出,如ExitThread和TerminateThread。系統會把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