多執行緒中線程同步的幾種方式

2022-03-03 07:07:41 字數 2440 閱讀 2081

原連線(msdn):   

執行緒的非同步特性意味著必須協調對資源(如檔案控制代碼、網路連線和記憶體)的訪問。否則,兩個或更多的執行緒可能在同一時間訪問相同的資源,而每個執行緒都不知道其他執行緒的操作。結果將產生不可預知的資料損壞。

對於整數資料型別的簡單操作,可以用 interlocked

類的成員來實現執行緒同步。對於其他所有資料型別和非執行緒安全的資源,只有使用本主題中的結構才能安全地執行多執行緒處理。

lock 關鍵字

lock

關鍵字可以用來確保**塊完成執行,而不會被其他執行緒中斷。這是通過在**塊執行期間為給定物件獲取互斥鎖來實現的。                

lock

語句以關鍵字 lock

開頭,它有乙個作為引數的物件,在該引數的後面還有乙個一次只能由乙個執行緒執行的**塊。例如:                

c#複製

public

class testthreading

}}

提供給 lock

關鍵字的引數必須為基於引用型別的物件,該物件用來定義鎖的範圍。在上面的示例中,鎖的範圍限定為此函式,因為函式外不存在任何對物件 lockthis 的引用。如果確實存在此類引用,鎖的範圍將擴充套件到該物件。嚴格地說,提供給 lock

的物件只是用來唯一地標識由多個執行緒共享的資源,所以它可以是任意類例項。然而,實際上,此物件通常表示需要進行執行緒同步的資源。例如,如果乙個容器物件將被多個執行緒使用,則可以將該容器傳遞給 lock,而 lock 後面的同步**塊將訪問該容器。只要其他執行緒在訪問該容器前先鎖定該容器,則對該物件的訪問將是安全同步的。

監視器與 lock

關鍵字類似,監視器防止多個執行緒同時執行**塊。enter

方法允許乙個且僅乙個執行緒繼續執行後面的語句;其他所有執行緒都將被阻止,直到執行語句的執行緒呼叫 exit

。這與使用 lock

關鍵字一樣。事實上,lock

關鍵字就是用 monitor

類來實現的。例如:                

lock (x)

這等效於:                

system.object obj = (system.object)x;

system.threading.monitor.enter(obj);

tryfinally

使用 lock

關鍵字通常比直接使用 monitor

類更可取,一方面是因為 lock

更簡潔,另一方面是因為 lock

確保了即使受保護的**引發異常,也可以釋放基礎監視器。這是通過 finally

關鍵字來實現的,無論是否引發異常它都執行關聯的**塊。

同步事件和等待控制代碼

使用鎖或監視器對於防止同時執行區分執行緒的**塊很有用,但是這些構造不允許乙個執行緒向另乙個執行緒傳達事件。這需要「同步事件」,它是有兩個狀態(終止和非終止)的物件,可以用來啟用和掛起執行緒。讓執行緒等待非終止的同步事件可以將執行緒掛起,將事件狀態更改為終止可以將執行緒啟用。如果執行緒試圖等待已經終止的事件,則執行緒將繼續執行,而不會延遲。                

同步事件有兩種:autoresetevent

和 manualresetevent

。它們之間唯一的不同在於,無論何時,只要 autoresetevent

啟用執行緒,它的狀態將自動從終止變為非終止。相反,manualresetevent

允許它的終止狀態啟用任意多個執行緒,只有當它的 reset

方法被呼叫時才還原到非終止狀態。                

可以通過呼叫 waitone

、waitany

或 waitall

等中的某個等待方法使執行緒等待事件。waithandle.waitone()

使執行緒一直等待,直到單個事件變為終止狀態;waithandle.waitany()

阻止執行緒,直到乙個或多個指示的事件變為終止狀態;waithandle.waitall()

阻止執行緒,直到所有指示的事件都變為終止狀態。當呼叫事件的 set

方法時,事件將變為終止狀態。                

在下面的示例中,建立了乙個執行緒,並由 main 函式啟動該執行緒。新執行緒使用 waitone

方法等待乙個事件。在該事件被執行 main 函式的主線程終止之前,該執行緒一直處於掛起狀態。一旦該事件終止,輔助線程將返回。在本示例中,因為事件只用於乙個執行緒的啟用,所以使用 autoresetevent

或 manualresetevent

類都可以。                

c#複製

using system;

using system.threading;

class threadingexample

static

void main()

}

多執行緒中線程「同步」概念的理解

接觸執行緒很久了,一直就只知道多執行緒併發中很有可能引起執行緒安全問題,所以啊就需要進行執行緒同步,就是通過什麼synchronize,lock,volatile,juc並發包下的那幾個類,threallocal,aqs,原子變數和阻塞佇列啊等等這些實現同步,但回過頭來想想 同步 到底是個什麼?是執...

Linux多執行緒同步的幾種方式

執行緒的最大特點是資源的共享性,但資源共享中的同步問題是多執行緒程式設計的難點。linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖 條件變數和訊號量。1 互斥鎖 mutex 通過鎖機制實現執行緒間的同步。同一時刻只允許乙個執行緒執行乙個關鍵部分的 int pthread mutex ini...

多執行緒 實現多執行緒的幾種方式

public class mythread extends thread mythread mythread1 newmythread mythread mythread2 newmythread mythread1.start mythread2.start public class mythre...