zoukankan      html  css  js  c++  java
  • 同步对象 AutoResetEvent

    操作:waitone() 阻塞当前线程,等待接收信号量。是线程中wait操作,会阻塞当前线程,不占用cpu资源,同时会释放上面的锁资源。

             set() 发出信号量。

    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));
                payMoneyThread.Name = "付钱线程";
                Thread getBookThread = new Thread(new ThreadStart(GetBookProc));
                getBookThread.Name = "取书线程";
                payMoneyThread.Start();
                getBookThread.Start();
    
                for (int i = 1; i <= numIterations; i++)
                {
                    Console.WriteLine("买书线程:数量{0}", i);
                    number = i;
                    //Signal that a value has been written.
                    myResetEvent.Set();
                    ChangeEvent.Set();
                    Thread.Sleep(0);
                }
                payMoneyThread.Abort();
                getBookThread.Abort();
            }
    
            static void PayMoneyProc()
            {
                while (true)
                {
                    myResetEvent.WaitOne();
                    //myResetEvent.Reset();
                    Console.WriteLine("{0}:数量{1}", Thread.CurrentThread.Name, number);
                }
            }
            static void GetBookProc()
            {
                while (true)
                {
                    ChangeEvent.WaitOne();
                    // ChangeEvent.Reset();               
                    Console.WriteLine("{0}:数量{1}", Thread.CurrentThread.Name, number);
                    Console.WriteLine("------------------------------------------");
                    Thread.Sleep(0);
                }
            }
        }
    }
    

      

    autoResetEvent:通知等待线程事件已经触发。 每次都能重制信号量的初始值。
    waitone:阻塞当前线程,直到接收到信号量。
    set:会设置为终止状态(不会阻塞),因为是autoreset,等下次再用的是重置为非终止状态。

    而 manualRestEvent 每次set之后,会设置为终止状态,所以不会阻塞程序,可以调用reset搞定。

  • 相关阅读:
    2.NET Core设定数据库种子
    1.ASP.NET Core 中向 Razor Pages 应用添加模型
    获取文件夹目录下的文件信息
    dataGridView读写文本
    C# winform 启动外部程序
    netcore访问本地磁盘
    c#利用定时器自动备份数据库(mysql)
    c#mysql数据库备份还原
    Linux之旅(二)
    Linux之旅
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/4901217.html
Copyright © 2011-2022 走看看