1. 程式人生 > >AutoResetEvent 和 ManualResetEvent 多線程應用

AutoResetEvent 和 ManualResetEvent 多線程應用

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 多線程應用