多线程学习笔记

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

posted @ 2013-10-15 10:15  gavin.huang  阅读(184)  评论(0编辑  收藏  举报