C 多執行緒 6 執行緒通知

2022-01-10 03:34:07 字數 2872 閱讀 4667

目錄回顧一下,前面 lock、monitor 部分我們學習了執行緒鎖,mutex 部分學習了程序同步,semaphor 部分學習了資源池限制。

這一篇將學習 c# 中用於傳送執行緒通知的 autorestevent 類。

用於從乙個執行緒向另乙個執行緒傳送通知。

微軟文件是這樣介紹的:表示執行緒同步事件在乙個等待執行緒釋放後收到訊號時自動重置。

其建構函式只有乙個:

建構函式裡面的引數用於設定訊號狀態。

建構函式

說明autoresetevent(boolean)

用乙個指示是否將初始狀態設定為終止的布林值初始化 autoresetevent 類的新例項。

真糟糕的機器翻譯。

autorestevent 類是幹嘛的,建構函式的引數又是幹嘛的?不著急,我們來先來看看這個類常用的方法:

方法說明

close()

釋放由當前 waithandle 占用的所有資源。

reset()

將事件狀態設定為非終止,從而導致執行緒受阻。

set()

將事件狀態設定為有訊號,從而允許乙個或多個等待執行緒繼續執行。

waitone()

阻止當前執行緒,直到當前 waithandle 收到訊號。

waitone(int32)

阻止當前執行緒,直到當前 waithandle 收到訊號,同時使用 32 位帶符號整數指定時間間隔(以毫秒為單位)。

waitone(int32, boolean)

阻止當前執行緒,直到當前的 waithandle 收到訊號為止,同時使用 32 位帶符號整數指定時間間隔,並指定是否在等待之前退出同步域。

waitone(timespan)

阻止當前執行緒,直到當前例項收到訊號,同時使用 timespan 指定時間間隔。

waitone(timespan, boolean)

阻止當前執行緒,直到當前例項收到訊號為止,同時使用 timespan 指定時間間隔,並指定是否在等待之前退出同步域。

這裡我們編寫乙個這樣的程式:

建立乙個執行緒,能夠執行多個階段的任務;每完成乙個階段,都需要停下來,等待子執行緒發生通知,才能繼續下一步執行。

.waitone()用來等待另乙個執行緒傳送通知;

.set()用來對執行緒發出通知,此時autoresetevent變成終止狀態;

.reset()用來重置autoresetevent狀態;

class program

}public static void doone()

}

autoresetevent 物件有終止和非終止狀態。set()設定終止狀態,reset()重置非終止狀態。

這個終止狀態,可以理解成訊號已經通知;非終止狀態則是訊號還沒有通知。

注意,注意終止狀態和非終止狀態指的是 autoresetevent 的狀態,不是指執行緒的狀態。

執行緒通過呼叫 waitone() 方法,等待訊號;

另乙個執行緒可以呼叫 set() 通知 autoresetevent 釋放等待執行緒。

然後 autoresetevent 變為終止狀態。

需要注意的是,如果 autoresetevent 已經處於終止狀態,那麼執行緒呼叫waitone()不會再起作用。除非呼叫reset()

建構函式中的引數,正是設定這個狀態的。true 代表終止狀態,false 代表非終止狀態。如果使用new autoresetevent(true);,則執行緒一開始是無需等待訊號的。

在使用完型別後,您應直接或間接釋放型別,顯式呼叫close()/dispose()或 使用using。 當然,也可以直接退出程式。

需要注意的是,如果多次呼叫set()的時間間隔過短,如果第一次set()還沒有結束(訊號傳送需要處理時間),那麼第二次set()可能無效(不起作用)。

我們設計乙個程式:

程式**如下(執行後,請將鍵盤設定成英文輸入狀態再按下按鍵):

兩個執行緒具有的功能:阻塞自己、解除另乙個執行緒的阻塞。

用電影《最佳拍檔》裡面的乙個畫面來理解。

doone 、dotwo 輪流呼吸,不能自己控制自己呼吸,但自己能夠決定別人呼吸。

你搞我,我搞你,就能相互呼吸了。

當然waitone()也可以設定等待時間,如果 光頭佬(doone) 耍賴不讓 金剛(dotwo)呼吸,金剛等待一定時間後,可以強行盪動天平,落地呼吸。

注意,autorestevent 用得不當容易發生死鎖。

另外 autorestevent 使用的是核心時間模式,因此等待時間不能太長,不然比較耗費 cpu 時間。

autoresetevent 也適合用於執行緒同步。

另外,執行緒中使用waitone(),另乙個執行緒使用set()通知後, autoresetevent 物件會自動恢復非終止狀態,不需要執行緒使用reset()

c 非阻塞演算法 C 多執行緒系列(6)執行緒通知

回顧一下,前面 lock monitor 部分我們學習了執行緒鎖,mutex 部分學習了程序同步,semaphor 部分學習了資源池限制。這一篇將學習 c 中用於傳送執行緒通知的 autorestevent 類。用於從乙個執行緒向另乙個執行緒傳送通知。微軟文件是這樣介紹的 表示執行緒同步事件在乙個等...

多執行緒(6)執行緒屬性

1.執行緒id 執行緒id是從1開始自增,main執行緒是1.不能修改 2.執行緒名稱 可以在新建時候自己命名 3.守護執行緒 執行緒會自動繼5承父執行緒的屬性,如果是守護執行緒建立就是守護執行緒,main執行緒建立需要將daemon設成true。守護執行緒和使用者執行緒差不多,當jvm發現沒有使用...

03 Java多執行緒 執行緒等待通知機制

三 執行緒等待通知 四 參考 如果等待時長為t,當前時間為now,那麼now t以後超時 long overtime now t long remain t while result不滿足 remian 0 return result shop類模擬商店,初始狀態玩具是nothing,執行緒等待玩具...