1. 程式人生 > >MSDN 同步部分 個人筆記

MSDN 同步部分 個人筆記

終端 數值 通信 滿足 exec 英語 關於 ini ddr

(在知乎看到輪子哥說,掌握了MSDN上的並發部分 和 線程與進程部分就可以掌握所有語言的多線程編程,我在網上翻了一下並沒有中文版,所以決定自己翻譯一下...)

目錄:

線程之間協同運行的方式有許多種,下面所述的函數提供了線程之間並發獲取資源的方式。

  • 同步部分的新特性
  • 關於同步
  • 使用線程同步
  • 參考

同步部分的新特性:

Windows提供了下面的新特性:

Win8

EN 此內容沒有您的語言版本,但有英語版本。

同步的新特性

DeleteSynchronizationBarrier

刪除屏障同步

EnterSynchronizationBarrier
   進入屏障同步,讓調用的線程等待當前屏障同步直到其中線程數目達到最大值。
GetOverlappedResultEx
   在規定時間內獲取某一個文件或者明明管道,通信管道中重疊操作的結果。
InitializeSynchronizationBarrier
   規定一個屏障同步中最大線程數目

Specifies the maximum number of threads and spin count for a new synchronization barrier.

WaitOnAddress

等待地址中數據發生改變

WakeByAddressAll

喚醒所有等待該地址上數據發生改變的線程

WakeByAddressSingle

喚醒一個等待該地址上數據發生改變的線程

關於同步

為了同步獲取資源,在等待函數中使用一個同步對象,同步對象的狀態分為就緒狀態和等待狀態,等待函數允許一個線程阻塞自身直到某個特定的等待狀態對象進入就緒態。

同步對象:
同步對象是一個句柄能夠傳入等待函數來協調多線程執行的對象,多個進程可以擁有同一個同步對象的句柄,為進程之間的通信提供了可能。

下列對象類型是專門為同步提供的:
事件類型:在事件發生的時候通知一個或者多個等待線程。
互斥量:能夠在某一時刻被一個線程持有,使得線程之間能夠協調獲取共享資源。
信號量:維護一個不小於零的數值,來限制能夠獲取當前共享資源的線程數量。
等待計時器:通知一個或者多個線程等待時刻已到。

下列對象類型可以提供同步服務:
改變通告:當特定的改變在某個文件夾發生,狀態被設置為就緒
終端輸入:當終端輸入緩沖區存在尚未讀取的數據,被設置為就緒,當緩沖區為空,被設置為等待。
任務(Job):當任務重所有進程都超時結束的時候狀態被設置為就緒態
內存資源通告:特定內存發生特定改變,狀態被設置為就緒態。
進程:進程運行期間為等待,進程結束後設置為就緒態。
線程:運行期間為等待,結束後為就緒態。

特定情況下也可以使用文件,具名管道來當制作等待對象,但是這種用法不太好,我們可以選擇使用異步IO來等待OVERLAPPED結構中的事件被設置為就緒,這樣比直接使用事件

對象更加安全因為這樣避免了多個重疊操作發生混淆(在同一個具名管道或者文件上的多個重疊操作),在這種情況下我們沒有辦法直到到底是什麽行為將等待對象置為就緒態的。

等待函數:
等待函數使得一個線程阻塞其自身的運行直到達到特定的條件,等待函數的類型決定了標準的類型,當一個等待函數被調用,它檢查是否達到了等待條件,如果沒有達到就繼續的等待直到超時或者被觸發。

單個對象等待函數
要求一個指向等待對象的句柄,當滿足下列條件之一的時候函數返回:
1.特定對象進入就緒狀態
2.達到等待時間


多個對象等待函數
傳入一個數組,當期這種一個進入就緒狀態或者達到等待時間,函數返回
返回第一個就緒對的對象句柄

可選等待函數
特定條件滿足的時候返回

註冊等待函數
等待函數室友線程池的一個線程運行的,當特定條件達到的時候,毀掉函數會被線程池中的線程運行。
默認情況下,註冊等待是一個多重等待操作,系統每次都會在時間進入就緒態之後重置它,如果我們要聲明這個對象只要被調用一次,傳入 WT_EXECUTEONLYONCE.


地址等待
線程可以使用地址等待函數來等待目標地址的值改變。函數當改變地址值得線程調用一個WakeByAddressSingle 的時候返回。


與等待對形象的關系
等待函數能夠修改幾種同步對象的狀態。當著街對象進入就緒態導致函數返回的時候修改會發生,等待函數只能按照以下的幾種寫實來修改等待對象:
信號量的值減一
將胡質量,自動重置函數和狀態改變對象的狀態設置為等待狀態
計時器設置為等待狀態
手動重置時間,手動重置計時器,進程線程和終端輸入對象不會被等待函數修改

創建窗口


在使用等待函數創建窗口的時候一定要小心,如果一個線程創建了窗口,那麽該線程必須處理信息,信息廣播到所有的系統窗口中,如果你有一個沒有設置等待間隔的等待函數系統將會死鎖!


下列是一些同步方法:

MSDN 同步部分 個人筆記