• WaitHandle、AutoResetEvent、ManualResetEvent整理


    WaitHandle是一个用以控制线程同步的类,有WaitOne()方法,用以阻止当前线程(提前是其状态为Nonsignaled,即红灯,后面解释),直到当前的 WaitHandle 收到绿灯信号。

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

    这两个状态是通过函数Set()Reset()来设置的。前者设为绿灯,后者设为红灯。


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

    ManualResetEvent manualWait = new ManualResetEvent(false);

    (2) WaitHandle没有Set方法,所以不能使暂停的线程得以继续,所以 一般不单用WaitHandle。其常会用作参数,尤其是AutoResetEventManualResetEvent都用到的情况,提供一定的通用性。


    AutoResetEventManualResetEvent都继承自WaitHandle,都有Set()Reset()方法,当然也继承了WaitOne()方法和两个状态。

    (1)ManualResetEventSet()Reset()方法即上面的功能,将状态分别设成绿灯和红灯。

    (2)AutoResetEvent比较特别,正如名字所示,在Set()完后,它会立即自动调用Reset,所以一般只用Set()方法。


    说明:这类对象可以被用在多个并发线程中,只要调用WaitOne,则都会暂停运行。ManualResetEventSet,可以让所有这些线程都继续运行,Reset又都停止,而AutoResetEvent则通过Set可实现一次只有一个被阻止的线程释放。

  • 相关阅读:
    switch选择结构
    变量与数据类型
    if选择结构
    NewSQL数据库VoltDB特性简介
    关系代数的并行计算
    【伯乐在线】程序员一定要投资的那些事
    Spark on Yarn
    六星经典CSAPP笔记(1)计算机系统巡游
    程序员的“机械同感”
    Impala中的代码生成技术
  • 原文地址:https://www.cnblogs.com/68681395/p/1885366.html
Copyright © 2020-2023  润新知