• 多线程学习笔记


    一:ManualResetEvent

    [ComVisibleAttribute(true)]
    [HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true,
    ExternalThreading = true)]
    public sealed class ManualResetEvent : EventWaitHandle

    msdn定义:通知一个或多个正在等待的线程已发生事件。

    ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。

    当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。

    一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。

    可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false

    ManualResetEvent 也可以同 staticWaitAllWaitAny 方法一起使用。

    Reset

    将事件状态设置为非终止状态,导致线程阻止。 (继承自 EventWaitHandle。)

    Set

    将事件状态设置为终止状态,允许一个或多个等待线程继续。 (继承自 EventWaitHandle。)

    WaitOne()

    阻止当前线程,直到当前 WaitHandle 收到信号。 (继承自 WaitHandle。)
    在 XNA Framework 中,此成员由 WaitOne() 重写。

     二:AutoResetEvent类

    [ComVisibleAttribute(true)]
    public sealed class AutoResetEvent : EventWaitHandle

    msdn定义:通知正在等待的线程已发生事件。无法继承此类。

    AutoResetEvent 使线程可以通过发信号来互相通信。通常,此通信涉及线程需要独占访问的资源。

    线程通过对 AutoResetEvent 调用 WaitOne 方法来等待信号。如果 AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 方法来通知资源可用。

    调用 SetAutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

    如果当 AutoResetEvent 为终止状态时线程调用 WaitOne,则线程不会被阻止。AutoResetEvent 将立即释放线程并返回到非终止状态。

    重要说明重要说明:

    不能保证对 Set 方法的每次调用都释放线程。如果两次调用十分接近,以致在线程释放之前便已发生第二次调用,则只释放一个线程。就像第二次调用并未发生一样。另外,如果在调用 Set 时不存在等待的线程且 AutoResetEvent 已终止,则该调用无效。

    可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态:如果初始状态为终止状态,则为 true;否则为 false

    AutoResetEvent 也可以同 staticWaitAllWaitAny 方法一起使用。

    有关线程同步机制的更多信息,请参见概念文档中的 EventWaitHandle、AutoResetEvent 和 ManualResetEvent同步基元

    AutoResetEvent和ManualResetEvent这两个类经常用到,他们的用法很类似,但也有区别的:

    autoevent.WaitOne()每次只允许一个线程进入,当某个线程得到信号(也就是有其他线程调用了autoevent.Set()方法后)后,autoevent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只有继续等待.也就是说,autoevent一次只唤醒一个线程

    而manualevent则可以唤醒多个线程,因为当某个线程调用了set方法后,其他调用waitone的线程获得信号得以继续执行,而manualevent不会自动将信号置为不发送.也就是说,除非手工调用了anualevent.Reset().方法,则manualevent将一 直保持有信号状态,manualevent也就可以同时唤醒多个线程继续执行

  • 相关阅读:
    决策树算法
    数据挖掘建模-Logistic回归
    Python数据结构与算法-栈和递归函数
    使用python自动化生成软件著作权的源代码
    一起玩转图论算法(1)图的基本表示
    全网最最最详细的软件著作权申请步骤
    时间序列模式(ARIMA)---Python实现
    宝塔面板怎样部署SSL证书?
    Linux基础概念入门
    转载:VMware workstation创建虚拟机,安装Ubuntu系统
  • 原文地址:https://www.cnblogs.com/gavinhuang/p/3369701.html
Copyright © 2020-2023  润新知