三種線程間的同步

來源:互聯網
上載者:User

第一種 互斥對象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();

三者之間的比較

互斥對象和事件對象屬於核心對象,利用核心對象進行線程同步,速度較慢,但利用互斥對象和事件對象這樣的核心對象,可以在多個進程中

的各個線程間進行同步。
關鍵程式碼片段(臨界區)是工作在使用者方式下,同步速度較快,但在使用關鍵程式碼片段時,很容易進入死結狀態,因為在等待進入關鍵程式碼片段時無法

設定逾時值。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.