回顧一下,前面 lock、monitor 部分我們學習了執行緒鎖,mutex 部分學習了程序同步,semaphor 部分學習了資源池限制。
這一篇將學習 c# 中用於傳送執行緒通知的 autorestevent 類。
用於從乙個執行緒向另乙個執行緒傳送通知。
微軟文件是這樣介紹的:表示執行緒同步事件在乙個等待執行緒釋放後收到訊號時自動重置。
其建構函式只有乙個:
建構函式裡面的引數用於設定訊號狀態。
真糟糕的機器翻譯。
autorestevent 類是幹嘛的,建構函式的引數又是幹嘛的?不著急,我們來先來看看這個類常用的方法:
這裡我們編寫乙個這樣的程式:
建立乙個執行緒,能夠執行多個階段的任務;每完成乙個階段,都需要停下來,等待子執行緒發生通知,才能繼續下一步執行。
class program
}public static void doone()
}
autoresetevent 物件有終止和非終止狀態。set() 設定終止狀態,reset() 重置非終止狀態。
這個終止狀態,可以理解成訊號已經通知;非終止狀態則是訊號還沒有通知。
注意,注意終止狀態和非終止狀態指的是 autoresetevent 的狀態,不是指執行緒的狀態。
執行緒通過呼叫 waitone() 方法,等待訊號;需要注意的是,如果 autoresetevent 已經處於終止狀態,那麼執行緒呼叫 waitone() 不會再起作用。除非呼叫reset() 。另乙個執行緒可以呼叫 set() 通知 autoresetevent 釋放等待執行緒。
然後 autoresetevent 變為終止狀態。
建構函式中的引數,正是設定這個狀態的。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 執行緒 非阻塞執行緒實踐
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 類。用於從乙個執行緒向另乙個執行緒傳送通知。微軟文件是這樣介紹的 表示執行緒同步事件在乙...