zoukankan      html  css  js  c++  java
  • 关于ManualResetEvent信号机制。

    从字面上理解ManualResetEvent是手动重置事件(这个事件是代指第三方的事件实体)

    这个也是用于线程同步的。这个应该是保证 线程之间的执行顺序。

    常用的几个方法是:Reset(),set(),WaitOne()

    set()是将ManualResetEvent对象的value值设置为True

    Reset()是将ManualResetEnvent对象的Value值设置为False

    一般情况下ManualResetEnvent对象最起码是一个类里面的全局变量。

    当类里面有线程的时候就可以通过这个对象进行线程之间运行顺序的控制。就像我们用bool类型的全局变量控制线程循环的执行。因为这个东西不需要考虑线程的同步问题,bool值首先是值类型数据,赋值语句的操作无论如何在同一个时刻只要一个命令就可以操作完毕。ManualResetEnvent也是这个道理,它的值就是一个bool类型,我们不需要考虑ManualResetEnvent对象的线程同步问题(如果他都需要考虑线程同步问题,他还怎么控制线程呀)

    其控制线程的办法就是WaitOne()方法。这个语句的作用是将当前线程设置中断(前提WaitOne之前ManualResetEnvent的对象的值要是False),直到有其他线程调用ManualResetEnvent对象的Set()方法(这就可以理解为什么ManualResetEnvent对象一般为类的全局变量了),也就是把ManualResetEnvent对象的Value设置为True。当被中断的线程收到ManualResetEnvent的对象值为True值时才继续执行下面的语句有点类似这样的代码while(一个bool变量==False) sleep(1);

    其实这个ManualResetEnvent就是学操作系统里面时候讲到的解决进程线程同步问题的一个方法:信号机制。

    所以有人称为ManualResetEnvent的Set()方法为设置信号,Reset()为重置信号,WaitOne()为等待信号。


    ——

    于阅读GPS设备模拟器类源码所写。

  • 相关阅读:
    尝试消除switch
    JsUnit的测试套件
    GetCallbackEventReference对我来说太复杂了
    实现获取客户端的MAC地址(2)
    控件开发复习
    在VS2008的JScript编辑器中显示为命名空间
    函数参数修饰符out、ref及空白的区别
    检测代码位置的比较(C#代码VS存贮过程)
    发布时,正在使用的用户出错
    js特效,加速度,图标跳动
  • 原文地址:https://www.cnblogs.com/edzjx/p/1778209.html
Copyright © 2011-2022 走看看