第一種 互斥對象Mutex
CreateMutex(,,)
第一個參數為安全層級,NULL為預設
第二個參數為Owner,false為沒有擁有者
第三個參數為本互斥對象,NULL為匿名(如果不是匿名,則“命名物件互斥”,即只能有一個執行個體對象)
返回一個Handle
Mutex和線程相關,內部有一個線程ID還有一個計數ID,看被引用了多少次。引用了多次就必須調用多少次ReleaseMutex(),如果當前線程已經
終止,則會自動釋放該Mutex,同時計數減一
請求互斥對象:
WaitForSingleObject(,) //是否變為有訊號狀態
第一個參數Handle
第二個參數時間間隔
傳回值:如果線程異常終止或者線程終止前沒ReleaseMutex,則返回WAIT_ABANDONED
註:Handle可以是下列對象的控制代碼:
Change notification
Console input
Event
Job
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
建立後需要CloseHandle()
ReleaseMutex()
第二種 事件對象Event
事件對象也是核心對象,可以實現線程間的同步
CreateEvent(,,,)
第一個參數,安全層級,NULL為預設層級
第二個參數,人工還是自動重設,TRUE,則需要手動ResetEvent(),FLASE,則系統自動重設為非訊號狀態
第三個參數,指定事件初始化狀態,TRUE,有訊號狀態,FLASE,非訊號狀態,(也可以在建立之後調用SetEvent(),設定是否為有訊號狀態)
第四個參數,事件對象的名字
WaitForSingleObject()這裡用Event為參
第三種 關鍵程式碼片段(臨界區)
InitializeCriticalSection()
EnterCriticalSection();//判斷能否得到,如果能這進入程式碼片段
LeaveCriticalSection();//訪問結束後,釋放所有權
DeleteCriticalSection();
三者之間的比較
互斥對象和事件對象屬於核心對象,利用核心對象進行線程同步,速度較慢,但利用互斥對象和事件對象這樣的核心對象,可以在多個進程中
的各個線程間進行同步。
關鍵程式碼片段(臨界區)是工作在使用者方式下,同步速度較快,但在使用關鍵程式碼片段時,很容易進入死結狀態,因為在等待進入關鍵程式碼片段時無法
設定逾時值。