C# AutoResetEvent的使用
AutoResetEvent 允許線程通過發信號互相通信。通常,此通信涉及線程需要獨佔訪問的資源。線程通過調用 AutoResetEvent 上的 WaitOne 來等待信號。如果 AutoResetEvent 處於非終止狀態,則該線程阻塞,並等待當前控制資源的線程
通過調用 Set 發出資源可用的信號。
調用 Set 向 AutoResetEvent 發信號以釋放等待線程。AutoResetEvent 將保持終止狀態,直到一個正在等待的線程被釋放,然後自動返回非終止狀態。如果沒有任何線程在等待,則狀態將無限期地保持為終止狀態。
可以通過將一個布爾值傳遞給構造函數來控制 AutoResetEvent 的初始狀態,如果初始狀態為終止狀態,則為 true;否則為 false。
通俗的來講只有等()成功運行後,One()才能夠獲得運行機會;Set是發信號,WaitOne是等待信號,只有發了信號,
等待的才會執行。如果不發的話,WaitOne後面的'程序就永遠不會執行。下面我們來舉一個例子:我去書店買書,當我選中一本書後我會去收費處付錢,
付好錢後再去倉庫取書。這個順序不能顛倒,我作為主線程,收費處和倉庫做兩個輔助線程,代碼如下:
using System;
using ;
using vities;
using ements;
using ading;
namespace CaryAREDemo
{
class Me
{
const int numIterations = 550;
static AutoResetEvent myResetEvent = new AutoResetEvent(false);
static AutoResetEvent ChangeEvent = new AutoResetEvent(false);
//static ManualResetEvent myResetEvent = new ManualResetEvent(false);
//static ManualResetEvent ChangeEvent = new ManualResetEvent(false);
static int number; //這是關鍵資源
static void Main()
{
Thread payMoneyThread = new Thread(new ThreadStart(PayMoneyProc));
= "付錢線程";
Thread getBookThread = new Thread(new ThreadStart(GetBookProc));
= "取書線程";
t();
t();
for (int i = 1; i <= numIterations; i++)
{
eLine("買書線程:數量{0}", i);
number = i;
//Signal that a value has been written.
();
();
p(0);
}
t();
t();
}
static void PayMoneyProc()
{
while (true)
{
One();
//t();
eLine("{0}:數量{1}", , number);
}
}
static void GetBookProc()
{
while (true)
{
One();
// t();
eLine("{0}:數量{1}", , number);
eLine("------------------------------------------");
p(0);
}
}
}
}
運行結果如下:
AutoResetEvent與ManualResetEvent的區別
他們的用法聲明都很類似,Set方法將信號置為發送狀態 Reset方法將信號置為不發送狀態WaitOne等待信號的發送。其實,從名字就可以看出一個手動,
一個自動,這個手動和自動實際指的是在Reset方法的處理上,如下面例子:
public AutoResetEvent autoevent=new AutoResetEvent(true);
public ManualResetEvent manualevent=new ManualResetEvent(true);
默認信號都處於發送狀態,
One();
One();
如果 某個線程調用上面該方法,則當信號處於發送狀態時,該線程會得到信號,得以繼續執行。差別就在調用後,One()每次只允許一個線程
進入,當某個線程得到信號(也就是有其他線程調用了()方法後)後,autoevent會自動又將信號置為不發送狀態,則其他調用WaitOne的線程只
有繼續等待.也就是説,autoevent一次只喚醒一個線程。而manualevent則可以喚醒多個線程,因為當某個線程調用了set方法後,其他調用waitone的線程
獲得信號得以繼續執行,而manualevent不會自動將信號置為不發送.也就是説,除非手工調用了t().方法,則manualevent將一直保持有信號狀態,manualevent也就可以同時喚醒多個線程繼續執行。如果上面的程序換成ManualResetEvent的話,就需要在waitone後面做下reset。
-
ACCP軟件工程師資料
ACCP軟件工程師是印度最早從事IT職業教育的Aptech計算機教育公司推出的培養軟件程序設計人員的課程體系,由北大青鳥集團於2000年引入中國。下面是小編收集的關於ACCP軟件工程師,希望大家認真閲讀!軟件工程師/ACCP軟件工程師當今社會不論是什麼職業的人都需要一個...
-
使用Java理解程序邏輯單詞精選
學計算機的都知道,單詞對於我們至關重要。下面YJBYS小編為大家整理了關於ACCP第一學期單詞《使用Java理解程序邏輯》,希望對你有所幫助。第一章Public['pʌblik]公開static['stætik]靜態void[vɔid]無返回main【main】主要的class【class...
-
accp5.0簡介
ACCP5.0是ACCP最新的職業教育課程體系,它的獨特之處在於每年都要根據技術的發展進行課程的更新。在確定ACCP課程體系之前,Aptech在IT領域專家和一些非IT公司中進行了廣泛的`行業調查,以瞭解他們在目前和將來的工作中會用到的數據庫系統、前端開發工具和軟件包等。...
-
軟件工程師待遇怎麼樣
軟件工程師英文是SoftwareEngineer,是從事軟件職業的人員的一種職業能力的認證,通過它説明具備了工程師的資格。軟件工程師是從事軟件開發相關工作的人員的統稱。下面是小編整理的關於軟件工程師待遇怎麼樣,歡迎大家參考!前不久,CSDN網站上刊載了一篇文章給軟件工...
相關文章
- 託福英語寫作範文:Examinations exert a pernicious influence on educat
- A Letter to Univsity Pesident about the Canteen Service on C
- Unit 9 A Have you ever been to a museum?八年級英語説課稿
- The Best Thing That Could Ever Happen少兒雙語閲讀
- A Letter to the University President為題目的作文
- Efforts Urged to Improve Womens Reproductive Health英語閲讀
- 八年級下冊Unit 9 have you ever been to museum? 説課稿
- 四級作文:Create a Conservation-Oriented Campus
- 九年級年級英語課文複習 Unit 1. Try not to translate every word
- It was nice to see your letter為題目的作文