五、互斥物件——更加靈活的同步方式
有時候你會覺得上面介紹的方法好像不夠用,對,我們解決了**和資源的同步問題,解決了多執行緒自動化管理和定時觸發的問題,但是如何控制多個執行緒相互之間的聯絡呢?例如我要到餐廳吃飯,在吃飯之前我先得等待廚師把飯菜做好,之後我開始吃飯,吃完我還得付款,付款方式可以是現金,也可以是信用卡,付款之後我才能離開。分析一下這個過程,我吃飯可以看作是主線程,廚師做飯又是乙個執行緒,服務員用信用卡收款和收現金可以看作另外兩個執行緒,大家可以很清楚地看到其中的關係——我吃飯必須等待廚師做飯,然後等待兩個收款執行緒之中任意乙個的完成,然後我吃飯這個執行緒可以執行離開這個步驟,於是我吃飯才算結束了。事實上,現實中有著比這更複雜的聯絡,我們怎樣才能很好地控制它們而不產生衝突和重複呢?
這種情況下,我們需要用到互斥物件,即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...