• 基元线程同步构造之waithandle中 waitone使用


    在使用基元线程同步构造中waithandle中waitone方法的讲解:

        调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 WaitHandle 收到绿灯信号。

        WaitHandle有两个状态"Signaled" and "Nonsignaled",前者可以理解为绿灯,绿灯状态时WaitOne方法无效,当前线程不会被阻止,后者可以理解为红灯,WaitOne()方法会阻止当前线程。

        (1):一般来说,初始状态都是"Nonsignaled",即红灯,这样当调用WaitOne时,线程会暂停掉,这正是通常情况下我们调用WaitOne时想要的效果。这也正是Reset(字面义“重置”)被定义为设成红灯的原因。所以初始化时参数用false,代表初始状态为红灯。

    ManualResetEvent manualWait = new ManualResetEvent(false);
        (2): WaitHandle没有Set方法,所以不能使暂停的线程得以继续,所以 一般不单用WaitHandle。其常会用作参数,尤其是AutoResetEvent和ManualResetEvent都用到的情况,提供一定的通用性。
        AutoResetEventManualResetEvent都继承自WaitHandle,都有Set()和Reset()方法,当然也继承了WaitOne()方法和两个状态。
        (1)ManualResetEvent的Set()和Reset()方法即上面的功能,将状态分别设成绿灯和红灯。当一个手动重置事件为true时,它解除正在等待它的所有线程的阻塞,因为内核不将事件自动重置回false;相反,你的代码必须将事件手动重置回false.
        (2)AutoResetEvent比较特别,正如名字所示,在Set()完后,它会立即自动调用Reset,所以一般只用Set()方法。当一个自动重置事件为true时,它只唤醒一个阻塞的线程,因为在解除第一个线程的阻塞后,内核将事件自动重置为false。
    说明:这类对象可以被用在多个并发线程中,只要调用WaitOne,则都会暂停运行。ManualResetEventSet,可以让所有这些线程都继续运行,Reset又都停止,而AutoResetEvent则通过Set可实现一次只有一个被阻止的线程释放
         示例:
       

    using System;
    using System.Threading;
    class WaitOne
    {
    //初始化为 false,即Nonsignaled,必须调用set后才能变成Signaled,
    //autoEvent.WaitOne();之后的代码才会运行,如果去掉
    //ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
    //autoEvent.WaitOne();之后的代码就永远不会运行了
    //如果初始化为 true即 new AutoResetEvent(true),去掉 ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
    //autoEvent.WaitOne();之后的代码也可运行
    static AutoResetEvent autoEvent = new AutoResetEvent(false);
    static void Main()
    {
      Console.WriteLine("Main starting.");
      ThreadPool.QueueUserWorkItem(
      new WaitCallback(WorkMethod), autoEvent);
      // Wait for work method to signal.
      autoEvent.WaitOne();
      Console.WriteLine("Work method signaled. Main ending.");
      Console.ReadLine();
    }
    static void WorkMethod(object stateInfo)
    {
      Console.WriteLine("Work starting.");
      // Simulate time spent working.
      Thread.Sleep(new Random().Next(100, 2000));
      // Signal that work is finished.
      Console.WriteLine("Work ending.");
      ((AutoResetEvent)stateInfo).Set();
    }
    }

    这是个人的一点点理解,希望大伙有好的意见再拍拍砖。。。。。。。

     

  • 相关阅读:
    机器人平台框架Yarp
    Git常用使用技巧
    Qt 5.x 开发技巧
    ROS (Robot Operating System) 相关资料与文档
    图形图像技术在手游中的潜在应用
    【Jmeter】Jmeter参数化的几种方式
    【Jmeter】调试取样器(Debug Sampler)进行调试
    【jmeter】实现接口关联的两种方式:正则表达式提取器和json提取器
    【Jmeter】Jmeter安装配置教程
    【Jmeter】第一个接口测试案例
  • 原文地址:https://www.cnblogs.com/huaan011/p/3570918.html
Copyright © 2020-2023  润新知