zoukankan      html  css  js  c++  java
  • 一个实例明白AutoResetEvent和 ManulResetEvent的用法

    先看一段代码:
    public class WaitHandlerExample {
                    public static AutoResetEvent waitHandler;
                    public static ManualResetEvent manualWaitHandler;

                    public static void ThreadPoolMain() {
                            waitHandler = new AutoResetEvent(false);
                            manualWaitHandler = new ManualResetEvent(false);

                            // Queue the task.
                            ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));            
                            ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc2));

                            Console.WriteLine("Main thread does some work, then waiting....");
                            manualWaitHandler.WaitOne();
                            //waitHandler.Reset();
                            manualWaitHandler.WaitOne();
                            //waitHandler.Reset();
                            Console.WriteLine("Main thread exits.");
                    }

                    // This thread procedure performs the task.
                    public static void ThreadProc(Object stateInfo) {
                            Thread.Sleep(1000);
                            Console.WriteLine("Hello from the thread pool.");
                            //waitHandler.Set();        //
                            manualWaitHandler.Set();//过去了,但是没关,也就是说 信号还是开着的。
                            //manualWaitHandler.Reset();
                    }
                    public static void ThreadProc2(object stateInfo) {
                            Thread.Sleep(100);
                            Console.WriteLine("Hello from the thread Pool2");
                            //waitHandler.Set();
                            manualWaitHandler.Set();//过去了,但是没有关
                    }
            }
    如果把 AutoResetEvent 比作 北京地铁的门闸,那么
    AutoResetEvent waitHandler=new AutoResetEvent(false);
    可以看作,初始化闸机口为关闭状态,
    waitHandler.WaitOne();
    可以看作刷卡
    waitHandler.Set()
    表示通过,并且闸机自动关闭(AutoReset)为下次通过做准备。他的一个重大的好处,就是线程只能一个一个通过,保持了顺序又避免了死锁。
     
    如果使用manualResetEvent 呢,那么在waitHandler.Set 之后,必须调用Reset()方法,为下面一位进去做好准备, 否则,就相当于无法再次刷卡。
     
    体现在程序中就是,AutoResetEvent 可以WaitOne 很多次,可是ManualResetEvent 如果不Reset 下次就不能使用. 这就是他们的区别。

    本文出自 “Xhinker” 博客,转载请与作者联系!

    转帖:http://xhinker.blog.51cto.com/640011/180377


  • 相关阅读:
    mysql之触发器before和after的区别
    字段与属性的区别
    功能性和非功能性需求 UP中FURPS+模型需求分类方式
    脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别
    抽象类、接口的区别 和 抽象类可以不实现接口的全部方法
    错误码:2003 不能连接到 MySQL 服务器在 (10061)
    在ubuntu下使用mysql API读取数据库的乱码问题
    vs2010下htmlcxx的编译以及环境的搭建
    effective c++ 条款15 在资源管理类中提供对原始资源的访问
    Qt 依赖包的加载
  • 原文地址:https://www.cnblogs.com/kevinGao/p/2270745.html
Copyright © 2011-2022 走看看