AutoResetEvent 和 ManualResetEvent 多線程應用
阿新 • • 發佈:2017-11-25
eset 結果 應用 back reset str 環形隊列 隨機 bool
AutoResetEvent
1.用於在多線程,對線程進行阻塞放行
static AutoResetEvent auth0 = new AutoResetEvent(false); static AutoResetEvent auth1 = new AutoResetEvent(false); static void Main(string[] args) { Thread th = new Thread(t0); th.IsBackground = true; th.Start(); Thread th1= new Thread(t1); th1.IsBackground = true; th1.Start(); Console.ReadLine(); } static void t0() { Console.WriteLine("1"); auth1.Set(); auth0.WaitOne(); Console.WriteLine("3"); auth1.Set(); auth0.WaitOne(); Console.WriteLine("5"); auth1.Set(); } static void t1() { auth1.WaitOne(); Console.WriteLine("2"); auth0.Set(); auth1.WaitOne(); Console.WriteLine("4"); auth0.Set(); auth1.WaitOne(); Console.WriteLine("6"); }
多個線程對應多個 AutoResetEvent 實例,初始化設置阻塞false,WaitOne進行阻塞,當Set之後阻塞變成true程序進行,另外WaitOne之後AutoResetEvent會自動變成fase。
Set之後,若多個線程都WaitOne,會隨機向某個線程發送繼續執行的信號。
執行結果如圖
ManualResetEvent
2.Set之後多個線程會收到放行信號
static ManualResetEvent mAuth0 = new ManualResetEvent(false); static ManualResetEvent mAuth1 = new ManualResetEvent(false); static CircleQueue<bool> MyQueue = new CircleQueue<bool>(2); static void Main(string[] args) { Thread th = new Thread(t0); th.IsBackground = true; th.Start(); Thread th1 = new Thread(t1); th1.IsBackground = true; th1.Start(); Thread th2 = new Thread(t2); th2.IsBackground = true; th2.Start(); Console.ReadLine(); } static void t0() { Console.WriteLine("1-0"); mAuth1.Set(); mAuth0.WaitOne(); Console.WriteLine("2-0"); mAuth1.Set(); } static void t1() { bool r = mAuth1.WaitOne(); MyQueue.EnQueue(r); Console.WriteLine("2-1"); while (true) { bool[] ListA = MyQueue.GetAllQueue(); if (ListA.Contains(false) == false) { break; } Thread.Sleep(50); } mAuth1.Reset(); mAuth0.Set(); mAuth1.WaitOne(); Console.WriteLine("3-1"); } static void t2() { bool r = mAuth1.WaitOne(); MyQueue.EnQueue(r); Console.WriteLine("2-2"); while (true) { bool[] ListA = MyQueue.GetAllQueue(); if (ListA.Contains(false) == false) { break; } Thread.Sleep(50); } mAuth1.Reset(); mAuth0.Set(); mAuth1.WaitOne(); Console.WriteLine("3-2"); }
運行結果
其中用到了環形隊列,下次再討論。
AutoResetEvent 和 ManualResetEvent 多線程應用