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

2021-10-13 23:50:58 字數 2514 閱讀 3408

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

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

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

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

其建構函式只有乙個:

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

真糟糕的機器翻譯。

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

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

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

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() 可能無效(不起作用)。

我們設計乙個程式:

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

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

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

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

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

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

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

另外autorestevent使用的是核心時間模式,因此等待時間不能太長,不然比較耗費 cpu 時間。autoresetevent也適合用於執行緒同步。

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

c 執行緒 非阻塞執行緒實踐

1.先建立乙個列表並放置資料若干 這裡 0 9 2.然後在對列表的資料進行加工 這裡 將資料乘以2 3.將加工完了的資料表示出來。1.執行效果 namespace 非阻塞執行緒模擬 class zhusai void fun0 void fun1 list0 i 2 console.writelin...

C 多執行緒系列

個人感覺c 的程式設計,除了對演算法和類庫的使用以外,達到一定的水平以後,多執行緒的使用將會成為乙個很大的瓶頸。所以重新花費時間讀了一本書 net 4.0物件導向程式設計漫談 應用篇 裡面關於多執行緒的描述。自己做了乙個讀書筆記,把多執行緒部分的要點進行了梳理,並且適當的加上了一些自己的測試和理解。...

C 多執行緒 6 執行緒通知

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