利用核心對象同步線程

來源:互聯網
上載者:User

核心對象可用於不同進程間線程的同步。

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 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.