有時候你會覺得上面介紹的方法好像不夠用,對,我們解決了**和資源的同步問題,解決了多執行緒自動化管理和定時觸發的問題,但是如何控制多個執行緒相互之間的聯絡呢?例如我要到餐廳吃飯,在吃飯之前我先得等待廚師把飯菜做好,之後我開始吃飯,吃完我還得付款,付款方式可以是現金,也可以是信用卡,付款之後我才能離開。分析一下這個過程,我吃飯可以看作是主線程,廚師做飯又是乙個執行緒,服務員用信用卡收款和收現金可以看作另外兩個執行緒,大家可以很清楚地看到其中的關係
——我吃飯必須等待廚師做飯,然後等待兩個收款執行緒之中任意乙個的完成,然後我吃飯這個執行緒可以執行離開這個步驟,於是我吃飯才算結束了。事實上,現實中有著比這更複雜的聯絡,我們怎樣才能很好地控制它們而不產生衝突和重複呢?
這種情況下,我們需要用到互斥物件,即
system.threading
命名空間中的
mutex
類。大家一定坐過計程車吧,事實上我們可以把
mutex
看作乙個計程車,那麼乘客就是執行緒了,乘客首先得等車,然後上車,最後下車,當乙個乘客在車上時,其他乘客就只有等他下車以後才可以上車。而執行緒與
mutex
物件的關係也正是如此,執行緒使用
mutex.waitone()
方法等待
mutex
物件被釋放,如果它等待的
mutex
物件被釋放了,它就自動擁有這個物件,直到它呼叫
mutex.releasemutex()
方法釋放這個物件,而在此期間,其他想要獲取這個
mutex
物件的執行緒都只有等待。
下面這個例子使用了
mutex
物件來同步四個執行緒,主線程等待四個執行緒的結束,而這四個執行緒的執行又是與兩個
mutex
物件相關聯的。其中還用到
autoresetevent
類的物件,如同上面提到的
manualresetevent
物件一樣,大家可以把它簡單地理解為乙個訊號燈,使用
autoresetevent.set()
方法可以設定它為有訊號狀態,而使用
autoresetevent.reset()
方法把它設定為無訊號狀態。這裡用它的有訊號狀態來表示乙個執行緒的結束。
// mutex.cs
using system;
using system.threading;
public class mutexsample
public void t1start( )
public void t2start( )
public void t3start( )
public void t4start( )
}
下面是該程式的執行結果:
從執行結果可以很清楚地看到,執行緒
t2,t3
的執行是以
gm1的釋放為條件的,而t4在
gm2釋放後開始執行,
t1則在
gm1和
gm2都被釋放了之後才執行。
main()
函式最後,使用
waithandle
等待所有的
autoresetevent
物件的訊號,這些物件的訊號代表相應執行緒的結束。
C 的多執行緒機制探索
c 的多執行緒機制探索 與threadpool類不同,timer類的作用是設定乙個定時器,定時執行使用者指定的函式,而這個函式的傳遞是靠另外乙個 物件timercallback,它必須在建立timer物件時就指定,並且不能更改。定時器啟動後,系統將自動建立乙個新的執行緒,並且在這個執行緒裡執行使用者...
C 的多執行緒機制探索 3 1
c 的多執行緒機制探索 3.1 2007 04 03 15 51 三.執行緒的同步和通訊 生產者和消費者 假 設這樣一種情況,兩個執行緒同時維護乙個佇列,如果乙個執行緒對佇列中新增元素,而另外乙個執行緒從佇列中取用元素,那麼我們稱新增元素的執行緒為生產者,稱取用 元素的執行緒為消費者。生產者與消費者...
C 的多執行緒機制探索4
expression代表你希望跟蹤的物件,通常是物件引用。一般地,如果你想保護乙個類的例項,你可以使用this 如果你希望保護乙個靜態變數 如互斥 段在乙個靜態方法內部 一般使用類名就可以了。而statement block就是互斥段的 這段 在乙個時刻內只可能被乙個執行緒執行。using syst...