非同步程式設計(四)多執行緒的同步機制 Lock關鍵字

2022-07-07 12:45:12 字數 1015 閱讀 9141

一、前言

為什麼需要同步機制?臨界資源要求同一時間只有乙個程序訪問,因此在多執行緒中必須對臨界資源的訪問做同步限制。

同步分為兩種,一種是直接同步,即該資源的訪問是互斥的,不能允許多個執行緒同時訪問,如印表機資源;另外一種是間接同步,即程序的執行需要其他程序的結果,那麼這兩個程序間的執行就有先後順序,可以採用傳統的pv操作來實現間接同步。最典型的就是生產者-消費者問題。

lock機制主要是為了解決直接同步的問題。

二、用法

以此為例,guestnum 記錄了訪客數量,可能有多個訪客(約定每個訪客就是乙個獨立執行緒),由於執行緒的併發執行,可能會對guestnum的數值修改前後矛盾。比如印表機實際只有一台(臨界資源)
object objecta = new

object();//

必須是object型別嗎?

public

void lockop(bool

isnewguest)

}

抽象一下

lock

(objecta)

三、必須是object型別嗎?

lock操作的原理是獲取物件的互斥鎖,利用此互斥鎖進行臨界區限制。

所以,只要保證每次進入lock方法時被lock操作的都是同乙個物件(記憶體上就是指向同乙個記憶體位置),就可以實現lock功能。

那麼,引用型別其實都可以滿足此要求,因為同乙個變數名標誌的引用型別會始終指向同乙個位置。

值型別無法滿足要求,因為lock操作會使值型別裝箱,那麼這一次裝箱的結果和下一次裝箱的結果基本上是不會指向同乙個位置的,這樣lock也就無效了。

四、lock關鍵字實際進行了哪些操作?

lock實際上是monitor的語法糖,其工作流程如下。了解monitor,請移步

1.此物件是否被鎖?如果尚未被鎖,那麼我可以進入其標註的臨界資源(也就是code**段),而且由我獲取其互斥鎖並將其鎖住;

2.此物件已經被鎖,那麼我無法進入其標註的臨界資源,需要一直等待互斥鎖被釋放;

多執行緒的同步機制

1 event 用事件 event 來同步執行緒是最具彈性的了。乙個事件有兩種狀態 激發狀態和未激發狀態。也稱有訊號狀態和無訊號狀態。事件又分兩種型別 手動重置事件和自動重置事件。手動重置事件被設定為激發狀態後,會喚醒所有等待的執行緒,而且一直保持為激發狀態,直到程式重新把它設定為未激發狀態。自動重...

執行緒的同步機制

1 執行緒安全與非執行緒安全 非執行緒安全是當多個執行緒訪問同乙個物件彙總的成員變數時產生的,產生的後果就是髒讀,就是指讀到的資料是被更改過的。而執行緒安全就是對獲取成員變數的值經過同步處理,不會再出現髒讀的現象。2 執行緒不安全的產生條件 a.存在多個執行緒 b.多個執行緒共享同乙個資源 c.對共...

WIN32多執行緒四 執行緒同步機制Mutex

mutex與criticalsection相似,都為了處理多個執行緒對資源的訪問。區別是 mutex是核心物件,鎖住mutex需要花費更多的時間,mutex可以跨程序存在。沒有任何執行緒擁有mutex,這個mutex處於未激發狀態,執行緒通過呼叫waitfor 來獲得此mutex 除非這個執行緒re...