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搞定。

  • 相关阅读:
    [置顶] Blender 三维绘图及渲染软件 (开源优秀强大跨平台)
    观察力训练(福尔摩斯演绎法)
    Shiro 权限框架使用总结
    [置顶] 如何编写出优美的 JavaScript 代码
    TopCoder 入门教程 sqybi完善版
    开源 3D CAD 软件 gCAD3D 1.9.1 发布
    Java 局部内部类访问局部变量必须加 final 关键字
    [置顶] 程序员如何做出“不难看”的设计
    JavaFX DirectoryChooser[目录选择器]使用实例及源代码[图文]
    项目管理软件收集
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/4901217.html
Copyright © 2011-2022 走看看