c 執行緒同步的總結(摘抄)

2021-07-11 03:15:41 字數 1668 閱讀 8132

.net中的執行緒同步方式非常之多。

常見的有如下幾種

(1)lock關鍵字

lock的本質是monitor.enter,和monitor.exit。簡單來講進入大括號時執行的是monitor.enter(obj),離開大括號時執行的是monitor.exit(obj)。

lock不能鎖定指向null的物件,不能鎖定string型別雖然它也是引用。因為在.net中內容相同的字串只有乙個例項,如果加鎖可能會引起其他地方的混亂。顯然最好也不要鎖定public的物件。

比較常見的用法是lock(this),相當於限制物件自身(不包括相同類的其他物件多次訪問**區域)。

其他的用法比如說lock(typeof(類的名稱))。含義極為限制相同類所有物件的再次訪問。

lock (x)

等效於object obj = ( object )x

;system.threading

.monitor

.enter(obj);

try

finally

(2)使用monitor類

相比之下monitor類功能相對更多。比如bool gotlock = monitor.tryenter(myobject,1000)可以讓執行緒自主決定。

(3)如果只需要避免快取和主存不一致的情況,只需要使用volatile關鍵字好了,當多執行緒訪問時,都將直接訪問主存。

(4)使用system.threading.interlocked

這種方法可以對整形資料進行操作,保證對整形資料的操作為乙個原子操作。

(5)mutex

相當於monitor的簡化版本,不具備wait,pulse,pulseall等功能。不過mutex可以實現跨程序的,可以在不同程序甚至不同計算機上使用。儘管其可以實現執行緒同步,但是mutex**於win32的封裝,其轉化需要消耗更多的系統資源。

(6)readerwriterlock

lock機制下,顯然如果多個執行緒申請讀資料也會發生資源獨佔。這種情況下可以使用readerwriterlock。如果有執行緒申請寫資料,則該資源被鎖定,否則多個讀執行緒可以共享該區域。

(7)synchronizationattribute

當我們確定某個類的物件只能在同一時刻被同一執行緒訪問時,可以在定義該類時為其加入屬性並繼承如下類

[system.runtime.remoting.contexts.synchronization]

public

class synchronizedclass : system.contextboundobject

(8)methodimplattribute

和上述類似,在定義方法時,可以對乙個方法新增該屬性,規定其只被乙個執行緒訪問

[methodimpl(methodimploptions.synchronized)]

public void dosomeworksync()

(9)同步事件和等待控制代碼

同步事件有兩種,autoresetevent和 manualresetevent。這種用法本質上是傳遞事件。常用的方法有waitone和set和reset。前者在啟用乙個執行緒後自動變成reset狀態,而後者可以啟用任意多的執行緒直到手工調動reset。

多執行緒同步總結

同步方式 是否為核心物件 特點模擬場景 臨界區非核心物件 通過多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對臨界區的訪問。亭訊號量 核心物件 它允許多個執行緒在同一時刻訪問統一資源,但是需要限制同一時刻訪問此資源的最大執行緒數目。停車場剩餘車位數目 互斥...

執行緒同步方法總結

互斥鎖 自旋鎖 讀寫鎖對臨界資源的操作流程都是一樣的 為臨界資源加鎖,其他執行緒不可訪問 訪問臨界資源 訪問完成,解鎖,其他執行緒可以訪問 如果臨界資源是被加鎖的,需要等待被解鎖。執行緒用步較為複雜的方法 加鎖保護條件變數 判斷條件是否滿足,未滿足等待條件滿足,等待時執行緒是睡眠,直到滿足被喚醒 對...

C 執行緒同步

volatile是最簡單的一種同步方法,當然簡單是要付出代價的。它只能在變數一級做同步,volatile的含義就是告訴處理器,不要將我放入工作記憶體,請直接在主存操作我。www.bitscn.com 因此,當多執行緒同時訪問該變數時,都將直接操作主存,從本質上做到了變數共享。能夠被標識為volati...