C 的多執行緒機制探索(五) 更加靈活的同步方式

2021-04-13 05:15:11 字數 1644 閱讀 7233



有時候你會覺得上面介紹的方法好像不夠用,對,我們解決了**和資源的同步問題,解決了多執行緒自動化管理和定時觸發的問題,但是如何控制多個執行緒相互之間的聯絡呢?例如我要到餐廳吃飯,在吃飯之前我先得等待廚師把飯菜做好,之後我開始吃飯,吃完我還得付款,付款方式可以是現金,也可以是信用卡,付款之後我才能離開。分析一下這個過程,我吃飯可以看作是主線程,廚師做飯又是乙個執行緒,服務員用信用卡收款和收現金可以看作另外兩個執行緒,大家可以很清楚地看到其中的關係

——我吃飯必須等待廚師做飯,然後等待兩個收款執行緒之中任意乙個的完成,然後我吃飯這個執行緒可以執行離開這個步驟,於是我吃飯才算結束了。事實上,現實中有著比這更複雜的聯絡,我們怎樣才能很好地控制它們而不產生衝突和重複呢?

這種情況下,我們需要用到互斥物件,即

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...