AutoResetEvent 与 ManualResetEvent
实际上这两个东西是同一种东西,可以把他们理解为线程锁,两个不同的线程可以共享。
这两个类的构造函数参数都是传入一个 bool
值,这个 bool 值可以理解为一开始的时候,这个需要访问的资源是处于可用状态(true
)还是不可用状态(false
)。
AutoResetEvent 允许线程通过发信号互相通信。 通常,当线程需要独占访问资源时使用该类。
- 线程通过调用 AutoResetEvent 上的
WaitOne()
来等待信号。 如果资源为不可用状态,则线程会被阻止,并等待当前控制资源的线程通过调用Set()
来通知资源可用。 - 当前控制资源的线程调用
Set()
向 AutoResetEvent 发信号以通知等待线程现在资源可用。 AutoResetEvent 将保持可用状态,直到一个正在等待的线程开始控制资源,然后自动返回不可用状态。 如果没有任何线程在等待,则状态将无限期地保持为可用状态。 - 如果当 AutoResetEvent 为可用状态时线程调用
WaitOne()
,则线程不会被阻止。 AutoResetEvent 将立即使线程控制资源并返回到不可用状态。
而 ManualResetEvent 与 AutoResetEvent 的区别在于,ManualResetEvent 在资源重新被一个线程控制时,它不会将状态置为不可用状态,而是需要我们手动置位。