.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...