多執行緒程式設計 執行緒同步

2022-07-24 04:24:17 字數 989 閱讀 1127

同步,永遠是多執行緒程式設計中最核心和最重要的話題.同步相關的概念比如:臨界區,原子操作,以及互斥量等等

總的來說,在多個執行緒之間採取同步措施,無非是為了讓他們更好的協同工作或者維持共享資料的一致性.

1.共享資料的一致性:

實際上,保證共享資料一致性的最簡單且最好的方法,就是使得該資料成為乙個常量,但是如果把乙個計數器做成常量是不現實的,乙個可以被多個執行緒訪問和改變的計數器只能被看作是乙個變數.我要需要通過額外的手段來保證被多個執行緒共享的變數的一致性.這才有了臨界區這個概念.臨界區是只能被序列化的訪問或執行的某個資源或某段**.因而臨界區也被稱作為序列區域.保證臨界區有效的最佳方式是利用同步機制,在針對多執行緒程式的同步機制中包含了很多同步方法,包括原子操作和互斥量,也包括條件變數.

2.互斥量:

在同一時刻,只允許乙個執行緒處於臨界區之內的約束被稱為互斥(mutex),每乙個執行緒在進入臨界區之前都必須先鎖定某個物件,只有成功鎖定物件的執行緒才會被允許進入臨界區之內,否則會被阻塞,這個物件被稱為互斥物件或互斥量.

互斥量有兩種狀態:已鎖定狀態和未鎖定狀態.互斥量每次只能被鎖定一次.成功鎖定互斥量的執行緒會成為該互斥量的所有者,只有互斥量的所有者才能對該互斥量進行解鎖.

執行緒在離開互斥量的時候.必須要對響應的互斥量進行解鎖.既不能對乙個互斥量進行重複鎖定,也不能對乙個互斥量進行多次解鎖.

死鎖是使用互斥量的時候需要特別注意的問題.

互斥量簡單高效,並適用於絕大部分的共享資料的同步場景.互斥量的實現會使用到機器語言級別的院子操作,並僅在鎖定衝突的情況下才會涉及到系統呼叫的執行.這使得互斥量比其他同步方法(如訊號燈)的速度快很多.

3.條件變數:

與互斥量不同,條件變數的作用並不是保證在同一時刻僅有乙個執行緒訪問某乙個共享資料,而是在對應的共享資料的狀態發生變化時,通知其他因此而被阻塞的執行緒,條件變數總是和互斥量組合使用.互斥量為共享資料的訪問提供互斥支援,而條件變數可以就共享資料的狀態發生變化向相關執行緒發出通知,當執行緒成功鎖定互斥量從而訪問到共享資料的時候,共享資料的狀態並不一定正好滿足它的要求.

多執行緒程式設計2 執行緒同步

訊號量 訊號量通常有兩種 二進位制訊號量和計數訊號量。二進位制訊號量只有0和1兩種取值,計數訊號量有更大的取值範圍。訊號量一般用來保護一段 使其每次只能被乙個執行執行緒執行,要完成這個工作,可以使用二進位制訊號量。有時,希望可以允許有限數目的執行緒執行一段指定的 這時可以使用計數訊號量。建立 inc...

多執行緒程式設計 2 執行緒的同步

在 多執行緒程式設計 系列第一篇講述了如何啟動執行緒,這篇講述執行緒之間存在競爭時如何確保同步並且不發生死鎖。執行緒不同步引出的問題 下面做乙個假設,假設有100張票,由兩個執行緒來實現乙個售票程式,每次執行緒執行時首先檢查是否還有票未售出,如果有就按照票號從小到大的順序售出票號最小的票,程式的 如...

iOS多執行緒程式設計 執行緒同步總結

1 原子操作 osatomic系列函式 ios平台下的原子操作函式都以osatomic開頭,使用時需要包含標頭檔案。不同執行緒如果通過原子操作函式對同一變數進行操作,可以保證乙個執行緒的操作不會影響到其他執行緒內對此變數的操作,因為這些操作都是原子式的。因為原子操作只能對內建型別進行操作,所以原子操...