C 關於AutoResetEvent的介紹

2021-06-03 16:51:55 字數 3037 閱讀 7229

autoresetevent允許執行緒通過發訊號互相通訊。通常,此通訊涉及執行緒需要獨佔訪問的資源。

執行緒通過呼叫autoresetevent上的 waitone 來等待訊號。如果autoresetevent處於非終止狀態,則該執行緒阻塞,並等待當前控制資源的執行緒

通過呼叫 set 發出資源可用的訊號。

呼叫setautoresetevent發訊號以釋放等待執行緒。autoresetevent將保持終止狀態,直到乙個正在等待的執行緒被釋放,然後自動返回非終止狀態。如果沒有任何執行緒在等待,則狀態將無限期地保持為終止狀態。

可以通過將乙個布林值傳遞給建構函式來控制autoresetevent的初始狀態,如果初始狀態為終止狀態,則為true;否則為false

通俗的來講只有等myreseteven.set()成功執行後,myreseteven.waitone()才能夠獲得執行機會;set是發訊號,waitone是等待訊號,只有發了訊號,

等待的才會執行。如果不發的話,waitone後面的程式就永遠不會執行。下面我們來舉乙個例子:我去書店買書,當我選中一本書後我會去收費處付錢,

付好錢後再去倉庫取書。這個順序不能顛倒,我作為主線程,收費處和倉庫做兩個輔助線程,**如下:

執行結果如下:

using system;

using system.linq;

using system.activities;

using system.activities.statements;

using system.threading;

namespace caryaredemo

class me   

const int numiterations = 550;       

static autoresetevent myresetevent = new autoresetevent(false);   

static autoresetevent changeevent = new autoresetevent(false);    

static int number; //這是關鍵資源

static void main()   

thread paymoneythread = new thread(new threadstart(paymoneyproc));  

paymoneythread.name = "付錢執行緒";  

thread getbookthread = new thread(new threadstart(getbookproc));    

getbookthread.name = "取書執行緒";   

paymoneythread.start();  

getbookthread.start();

for (int i = 1; i <= numiterations; i++) 

console.writeline("買書執行緒:數量", i); 

number = i; 

myresetevent.set(); 

changeevent.set(); 

thread.sleep(0);  

paymoneythread.abort(); 

getbookthread.abort(); 

static void paymoneyproc()

while (true)

myresetevent.waitone();

console.writeline(":數量", thread.currentthread.name, number);

static void getbookproc()

while (true) 

changeevent.waitone();

console.writeline(":數量", thread.currentthread.name, number); 

console.writeline("------------------------------------------");

thread.sleep(0);

autoresetevent與manualresetevent的區別

他們的用法\宣告都很類似,set方法將訊號置為傳送狀態 reset方法將訊號置為不傳送狀態waitone等待訊號的傳送。其實,從名字就可以看出乙個手動,

乙個自動,這個手動和自動實際指的是在reset方法的處理上,如下面例子:

public autoresetevent autoevent=new autoresetevent(true);

public manualresetevent manualevent=new manualresetevent(true);

預設訊號都處於傳送狀態,

autoevent.waitone();

manualevent.waitone();

如果 某個執行緒呼叫上面該方法,則當訊號處於傳送狀態時,該執行緒會得到訊號,得以繼續執行。差別就在呼叫後,autoevent.waitone()每次只允許乙個執行緒

進入,當某個執行緒得到訊號(也就是有其他執行緒呼叫了autoevent.set()方法後)後,autoevent會自動又將訊號置為不傳送狀態,則其他呼叫waitone的執行緒只

有繼續等待.也就是說,autoevent一次只喚醒乙個執行緒。而manualevent則可以喚醒多個執行緒,因為當某個執行緒呼叫了set方法後,其他呼叫waitone的執行緒

獲得訊號得以繼續執行,而manualevent不會自動將訊號置為不傳送.也就是說,除非手工呼叫了manualevent.reset().方法,則manualevent將一直保持有訊號狀態,manualevent也就可以同時喚醒多個執行緒繼續執行。如果上面的程式換成manualresetevent的話,就需要在waitone後面做下reset。

關於C 指標

一.怎樣給多維陣列動態分配記憶體 allocate int p new int m for int i 0 i m i p i new int n use for int i 0 i m i for int j 0 j n j p i j i j free for int i 0 i m i del...

關於C指標

在 c語言中指標可以說是其精華,常有一句話,學會了指標你也就學會了 c語言。但是很多人不能理解指標。我寫這篇文章的目的是幫助大家理解指標,內容都是跟人的見解,沒有指標基礎的 c語言高手和不喜歡的就別看了。大家都認為,c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是 c...

c 關於記憶體。

對乙個指標new了以後,如果有可能作為右值,一定要初始化。對於二維陣列的分配記憶體。for int i 0 i height i 釋放記憶體。for int i 0 i height i delete param 3 複製構造原則上可以用賦值操作符代替,但需要注意的是,賦值操作符要先清空左值,但複製...