volatile是最簡單的一種同步方法,當然簡單是要付出代價的。它只能在變數一級做同步,volatile的含義就是告訴處理器, 不要將我放入工作記憶體, 請直接在主存操作我。(【**www.bitscn.com 】)因此,當多執行緒同時訪問該變數時,都將直接操作主存,從本質上做到了變數共享。
能夠被標識為volatile的必須是以下幾種型別:(摘自msdn)
any reference type.
any pointer type (in an unsafe context).
the types sbyte, byte, short, ushort, int, uint, char, float, bool.
an enum type with an enum base type of byte, sbyte, short, ushort, int, or uint.
lock是一種比較好用的簡單的執行緒同步方式,它是通過為給定物件獲取互斥鎖來實現同步的。它可以保證當乙個執行緒在關鍵**段的時候,另乙個執行緒不會進來,它只能等待,等到那個執行緒物件被釋放,也就是說執行緒出了臨界區。用法:
lock的引數必須是基於引用型別的物件,不要是基本型別像bool,int什麼的,這樣根本不能同步,原因是lock的引數要求是物件,如果傳入int,勢必要發生裝箱操作,這樣每次lock的都將是乙個新的不同的物件。最好避免使用public型別或不受程式控制的物件例項,因為這樣很可能導致死鎖。特別是不要使用字串作為lock的引數,因為字串被clr「暫留」,就是說整個應用程式中給定的字串都只有乙個例項,因此更容易造成死鎖現象。建議使用不被「暫留」的私有或受保護成員作為引數。其實某些類已經提供了專門用於被鎖的成員,比如array型別提供syncroot,許多其它集合型別也都提供了syncroot。
所以,使用lock應該注意以下幾點:
1、如果乙個類的例項是public的,最好不要lock(this)。因為使用你的類的人也許不知道你用了lock,如果他new了乙個例項,並且對這個例項上鎖,就很容易造成死鎖。
2、如果mytype是public的,不要lock(typeof(mytype))
3、永遠也不要lock乙個字串
monitor類提供了與lock類似的功能,不過與lock不同的是,它能更好的控制同步塊,當呼叫了monitor的enter(object o)方法時,會獲取o的獨占權,直到呼叫exit(object o)方法時,才會釋放對o的獨占權,可以多次呼叫enter(object o)方法,只需要呼叫同樣次數的exit(object o)方法即可,monitor類同時提供了tryenter(object o,[int])的乙個過載方法,該方法嘗試獲取o物件的獨占權,當獲取獨占權失敗時,將返回false。
但使用 lock 通常比直接使用 monitor 更可取,一方面是因為 lock 更簡潔,另一方面是因為 lock 確保了即使受保護的**引發異常,也可以釋放基礎監視器。這是通過 finally 中呼叫exit來實現的。事實上,lock 就是用 monitor 類來實現的。下面兩段**是等效的:
code
lock (x)
等效於object obj = ( object )x;
system.threading.monitor.enter(obj);
try
finally
如果整個方法內部的**都需要上鎖的話,使用methodimplattribute屬性會更簡單一些。這樣就不用在方法內部加鎖了,只需要在方法上面加上 [methodimpl(methodimploptions.synchronized)] 就可以了,mehthodimpl和methodimploptions都在命名空間system.runtime.compilerservices 裡面。但要注意這個屬性會使整個方法加鎖,直到方法返回,才釋放鎖。因此使用上不太靈活。如果要提前釋放鎖,則應該使用monitor或lock。我們來看乙個例子:
code
[methodimpl(methodimploptions.synchronized)]
public void dosomeworksync()
public void dosomeworknosync()
[stathread]
static void main( string args)
這裡,我們有兩個方法,我們可以對比一下,乙個是加了屬性methodimpl的dosomeworksync(),乙個是沒加的dosomeworknosync()。在方法中sleep(1000)是為了在第乙個執行緒還在方法中時,第二個執行緒能夠有足夠的時間進來。對每個方法分別起了兩個執行緒,我們先來看一下結果:
可以看出,對於執行緒1和2,也就是呼叫沒有加屬性的方法的執行緒,當執行緒2進入方法後,還沒有離開,執行緒1有進來了,這就是說,方法沒有同步。我們再來看看執行緒3和4,當執行緒3進來後,方法被鎖,直到執行緒3釋放了鎖以後,執行緒4才進來。
c 執行緒同步
以乙個程式來說明執行緒不同步所帶來的問題 class program private int counter 0 private void actionmethod t thread.currentthread.name,counter 結果如下 從上面的結果中可以看到主線程和子執行緒都在爭奪act...
C 執行緒同步
使用mutex類來同步兩個單獨的程式。mutex是一種原始的同步方式,其只對乙個執行緒授予對共享資源的獨佔訪問。const string nutexname c using var m new mutex false nutexname else 互斥量是全域性的作業系統物件,請務必正確關閉互斥量。...
C 執行緒同步
同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。如程序 執行緒同步,可理解為程序或執行緒a和b一塊配合,a執行到一定程度時要依靠b的某個結果,於是停下來,示意b執行 b依言執行,再將結果給a a再繼續操作。這裡的同步千萬不要理解成那個同時進行,應是指協同 協助 互相配合。執行緒同步是...