C 的多執行緒機制初探 5

2021-09-30 03:38:42 字數 1212 閱讀 9517

三.執行緒的同步和通訊--生產者和消費者

假設這樣一種情況,兩個執行緒同時維護乙個佇列,如果乙個執行緒對佇列中新增元素,而另外乙個執行緒從佇列中取用元素,那麼我們稱新增元素的執行緒為生產者,稱取用元素的執行緒為消費者。生產者與消費者問題看起來很簡單,但是卻是多執行緒應用中乙個必須解決的問題,它涉及到執行緒之間的同步和通訊問題。

前面說過,每個執行緒都有自己的資源,但是**區是共享的,即每個執行緒都可以執行相同的函式。但是多執行緒環境下,可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。c#提供了乙個關鍵字lock,它可以把一段**定義為互斥段(critical section),互斥段在乙個時刻內只允許乙個執行緒進入執行,而其他執行緒必須等待。在c#中,關鍵字lock定義如下:

lock(expression) statement_block

expression代表你希望跟蹤的物件,通常是物件引用。一般地,如果你想保護乙個類的例項,你可以使用this;如果你希望保護乙個靜態變數(如互斥**段在乙個靜態方法內部),一般使用類名就可以了。而statement_block就是互斥段的**,這段**在乙個時刻內只可能被乙個執行緒執行。

using system;

using system.threading;

internal class account

internal int withdraw(int amount)

//下面的**保證在當前執行緒修改balance的值完成之前

//不會有其他執行緒也執行這段**來修改balance的值

//因此,balance的值是不可能小於0的

lock (this)

else }

} internal void dotransactions() }

internal class test

for (int i = 0; i < 10; i++)

threads[i].name=i.tostring();

for (int i = 0; i < 10; i++)

threads[i].start();

console.readline(); } }

而多執行緒公用乙個物件時,也會出現和公用**類似的問題,這種問題就不應該使用lock關鍵字了,這裡需要用到system.threading中的乙個類monitor,我們可以稱之為監視器,monitor提供了使執行緒共享資源的方案。

C 的多執行緒機制初探 2

threadtest.cs using system using system.threading namespace threadtest public class catch threadstateexception return 0 這段程式包含兩個類alpha和 在建立執行緒othread時...

C 的多執行緒機制初探 3

在這裡我們要注意的是其它執行緒都是依附於main 函式所在的執行緒的,main 函式是c 程式的入口,起始執行緒可以稱之為主線程,如果所有的前台執行緒都停止了,那麼主線程可以終止,而所有的後台執行緒都將無條件終止。而所有的執行緒雖然在微觀上是序列執行的,但是在巨集觀上你完全可以認為它們在並行執行。讀...

C 的多執行緒機制初探 7

然後在下面這個類monitorsample的main 函式中我們要做的就是建立兩個執行緒分別作為生產者和消費者,使用cellprod.threadrun 方法和cellcons.threadrun 方法對同乙個cell物件進行操作。public class monitorsample catch t...