Windows中多執行緒的同步

2021-06-21 12:35:36 字數 1511 閱讀 3522

windows程序間同步方式有:1. 互斥量 mutex 2. 訊號量 semaphore 3.事件 event 4.臨界區 critical section 5.互鎖函式

臨界區和互鎖函式沒有相應的核心物件因而不能跨程序

只能同步同乙個程序的執行緒之間的同步,因為臨界區不能跨越程序的邊界工作。也是因為臨界區沒有

name

,所以不能跨程序使用。

訪問臨界區之前進行鎖定,訪問後進行解鎖

如果程序

b訪問程序

a鎖定的臨界區,那麼程序

b會被阻塞,直到執行緒

a釋放臨界區,執行緒bb

進行阻塞期間,不占用

cpu時間

.可以同步在相同程序

,或不同程序間的執行緒進行同步。所以互斥量是有

name

的,可以跨程序使用。

互斥量與臨界區的區別,如果乙個執行緒鎖定了臨界區,而終止時沒有解除臨界區的鎖定,那麼等待臨界區空閒的其他執行緒將無限期的阻塞下去。然而,如果鎖定互斥量的執行緒不能在其終止前解除互斥量的鎖定,那麼系統將認為互斥量被「放棄」了並自動釋放該互斥量,這樣等待程序就可以繼續執行了。

在任何特定時間,事件只能處在兩種狀態的一種:引發(設定)或者調低(重置)。設定可以任務是出於訊號狀態,重置事件可以認為是出於非訊號狀態。

事件也被描述為「執行緒觸發器」。事件也不能跨程序。同樣它沒有

name

。事件有自動設定事件和手動設定事件。其差別是當自動設定事件上阻塞的執行緒被喚醒時,該事件別自動設定為訊號狀態。手動設定事件不能自動重置,它必須使用程式設計的方式重置。 l

如果事件只觸發乙個執行緒,那麼使用自動設定事件和使用

setevent

喚醒等待執行緒。

這裡不需要呼叫

resetevent

,因為執行緒被喚醒的那一刻事件將被自動重置。

l如果事件將觸發兩個或者多個執行緒,那麼使用手動設定執行緒和使用

pulseevent

喚醒所以的等待執行緒。而且,您不需要呼叫

resetevent

,因為pluseevent

在喚醒所有等待執行緒後為你重置事件。

首先,訊號量可以同步不同程序,相同程序中的執行緒。

其次,訊號量跟其他

3種同步機制不同的是,上面

3種的同步機制的特性「要沒有,要麼沒有」,訊號量則不同,它始終代表可用資源的數量。鎖定訊號量會減少資源數,釋放訊號量則增加資源數。只有在資源數為

0的時候,執行緒才會被阻塞。

如何保證我們再修改某塊記憶體的

同時,不讓任何其他程序/執行緒修改呢?在direct內,比如在建立vertexbuffer

時,有locked和unlocked函式來保證目標記憶體同一時刻有唯一的程序/執行緒訪問。

就是要把該片記憶體先鎖定(鎖死), 然後再進行修改,然後再解鎖。

windows還為我們提供了互鎖函式來保證對單個變數的遞增或遞減是同一時刻唯一的。

它們是interlockedexchangeadd等函式。

Windows下C 多執行緒同步

程式 是計算機指令的集合,它以檔案的形式儲存在磁碟上。而程序通常被定義為乙個正在執行程式的例項,是乙個程式在其自身位址空間的依次執行活動。程序 執行緒 由執行緒的核心物件和執行緒棧組成 當多執行緒訪問全域性變數時需要多執行緒同步 互斥物件 事件物件 關鍵 段 互斥物件 互斥獨享可以看做是一把房間鑰匙...

windows多執行緒同步 臨界區

推薦參考部落格 秒殺多執行緒第五篇 經典執行緒同步 關鍵段cs 關於臨界區的觀念,一般作業系統書上面都有。適用範圍 它只能同步乙個程序中的執行緒,不能跨程序同步。一般用它來做單個程序內的 快同步,效率比較高 windows中與臨界區有關的結構是 critical section,關於該結構體的內部結...

windows多執行緒互斥和同步

位址二 win 多執行緒 define thread num 10 int threadcount 0 int threadno 0 用於互斥 critical section nocritical critical section countcritical handle nomutexhandl...