用AutoResetEvent實現同步

2021-05-24 14:41:34 字數 2440 閱讀 9149

c#讀寫者執行緒(用autoresetevent實現同步)

1. autoresetevent簡介

通知正在等待的執行緒已發生事件。無法繼承此類。

常用方法簡介:

autoresetevent(bool initialstate):建構函式,用乙個指示是否將初始狀態設定為終止的布林值初始化該類的新例項。

false:無訊號,子執行緒的waitone方法不會被自動呼叫

true:有訊號,子執行緒的waitone方法會被自動呼叫

public bool reset ():將事件狀態設定為非終止狀態,導致執行緒阻止;如果該操作成功,則返回true;否則,返回false。 

public bool set ():將事件狀態設定為終止狀態,允許乙個或多個等待執行緒繼續;如果該操作成功,則返回true;否則,返回false。

對於具有 eventresetmode.autoreset(包括 autoresetevent)的 eventwaithandle,set 方法釋放單個執行緒。如果沒有等待執行緒,等待控制代碼將一直保持終止狀態,直到某個執行緒嘗試等待它,或者直到它的 reset 方法被呼叫。

對於具有 eventresetmode.manualreset(包括 manualresetevent)的 eventwaithandle,呼叫set 方法將使等待控制代碼一直保持終止狀態,直到它的 reset 方法被呼叫。

waitone方法

當在派生類中重寫時,阻止當前執行緒,直到當前的 waithandle 收到訊號。

waithandle.waitone () 當在派生類中重寫時,阻止當前執行緒,直到當前的 waithandle 收到訊號。 由.net compact framework 支援。 

waithandle.waitone(int32, boolean)  在派生類中被重寫時,阻止當前執行緒,直到當前的waithandle 收到訊號,使用 32 位有符號整數度量時間間隔並指定是否在等待之前退出同步域。由 .net compact framework 支援。 

waithandle.waitone(timespan, boolean)  在派生類中被重寫時,阻止當前執行緒,直到當前例項收到訊號,使用 timespan 度量時間間隔並指定是否在等待之前退出同步域。

2. 讀寫者執行緒例子

本例子中,主線程作為寫執行緒,要對某個資料(本例中是個變數)賦值(即寫動作),而讀執行緒則等待寫執行緒每次寫完資料發出通知,待讀執行緒收到通知後,將資料讀出並顯示。

執行結果如下:

由執行結果可以看出,寫執行緒寫入的資料有丟失,主要原因是寫執行緒沒有給讀執行緒留足夠的時間去進行讀操作。

3. 對1進行修改

將主線程睡眠時間改為非0值,觀察執行結果。

執行結果如下:

有結果可知,當主線程睡眠時間大於0值時,讀執行緒即有足夠的時間讀取寫執行緒寫入的資料。這個睡眠時間的長短可以根據實際應用中子執行緒的計算量設定。

4. 對1再進行修改

主線程在寫完資料後根本不睡嗎呢?這個時候會發生什麼事情?

執行結果如下:

有結果可知,不睡眠的情況和睡眠時間為0(即thread.sleep(0);)效果產不多,只是不睡眠丟失的資料更多了。

5. 對1再修改

將傳遞給autoresetevent的建構函式的引數設定為true,觀察執行結果。

執行結果如下:

若將主線程的睡眠時間改為任意非0值,其執行結果均為下圖所示的結果。

6. 其他修改

將主線程呼叫autoresetevent物件的set方法刪除,分別對autoresetevent的建構函式的引數為false和true觀察執行結果。

為false,執行結果如下圖所示。

為true,執行結果如下圖所示。

至此,我想我們應該明白autoresetevent建構函式的引數的意義了。

false:無訊號,子執行緒的waitone方法不會被自動呼叫;

true:有訊號,子執行緒的waitone方法會被自動呼叫。

AutoResetEvent簡單理解

作為乙個.net菜鳥,也開通部落格啦,有時會也會一時興起記錄下所學的生疏知識點,在記錄的同時也望各位前輩指正批評!今天看了乙個新專案 這個專案是 商開發的一套半導體工廠eap系統,剛拿到 就看了看,發現autoresetevent這個東西之前還真沒見過,到底是個啥呢?查了幾篇資料之後,我粗略理解為執...

執行緒同步 AutoResetEvent

執行緒同步的其他方式 1 autoresetevent 使用waitone和set 進行阻塞和釋放阻塞的執行緒,waitone方法定義 public virtual bool waitone int millisecondstimeout 該方法用來阻塞執行緒,當在指定的時間間隔還沒有收到乙個訊號時...

談談AutoResetEvent的用法

autoresetevent屬性介紹 建構函式 autoresetevent bool initialstate 宣告時需要指明initialstate值。false 無訊號,子執行緒的waitone方法不會被自動呼叫 true 有訊號,子執行緒的waitone方法會被自動呼叫 reset 將事件狀...