zoukankan      html  css  js  c++  java
  • 多线程学习笔记

    一: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也就可以同时唤醒多个线程继续执行

  • 相关阅读:
    java equals与==的区别
    java中switch能否使用String作为参数?
    java九种数据类型以及封装类
    JavaWeb-----------------Json(一)
    JavaWeb-----------Ajax页面局部刷新(三)
    Linux下的C语言读写练习(二)
    Nginx HTTP负载均衡和反向代理的配置与优化
    kafka端口和zookeeper端口
    Correct the classpath of your application so that it contains a single, compatible version of org.springframework.util.Assert
    nginx简介&nginx基本配置和优化
  • 原文地址:https://www.cnblogs.com/gavinhuang/p/3369701.html
Copyright © 2011-2022 走看看