线程同步之ManualResetEvent 和AutoResetEvent

本文详细介绍了ManualResetEvent和AutoResetEvent两种同步机制。前者适用于一个线程需等待另一线程完成任务的情况,后者则常用于线程需要独占访问资源的场景。文章通过示例代码解释了这两种事件如何工作。

      ManualResetEvent :手动重置事件,通常用于一个线程在其他线程进行之前必须完成的任务。

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

当一个线程(比如线程A)开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。 此线程可被视为控制 ManualResetEvent。 调用 ManualResetEvent 上的 WaitOne 的线程将阻止(也就是其他线程将被阻止,比如线程B这时候调用WaitOne的线程将被阻止在该方法,也就是该方法不会立即返回),并等待信号。 当控制线程(线程A)完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。 并释放所有等待线程。

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

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

   


  
1 static ManualResetEvent _manualEvent = new ManualResetEvent( false ); // 创建,将其设置为非终止状态,这样调用_manualEvent.Wait 的线程将被阻塞。
2
3 // 这个函数所在的线程结束后,才开始其他线程
4
5 public static void SetValue()
6 {
7
8 // 这里不需要这样调用_manualEvent.Wait,因为其是前置的
9 Thread.Sleep( 5000 ); // 故意让此线程延迟一会儿
10 Console.WriteLine( " 正在更新数据 " );
11 value = 100 ;
12 Console.WriteLine( " 更新完毕value:{0} " ,value);
13 _manualEvent.Set(); // 通知其他进程可以读取数据,在这里设置之后,接下来等待的多个线程可以并发执行,而通过AutoResetEvent 设置的,在一个线程访问后又会自动Reset,后续的线程又会被阻塞。
14 }
15
16 // 等待某个线程完成后才能访问某个资源的线程所在的函数
17
18 public static void ReadValue()
19 {
20 Console.WriteLine( " 准备访问 " );
21 if (_manualEvent.WaitOne() == true ) // 如果_manualEvent是非终止状态则这个函数所在的线程会被阻塞
22 {
23 Console.WriteLine( " 开始访问 " );
24 Console.WriteLine(value);
25 }
26 }

 

      AutoResetEvent:自动重置事件允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程通过调用 Set 发出资源可用的信号。

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

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

      AutoResetEvent 作用?EventHandler?WaitHander?

  

转载于:https://www.cnblogs.com/wuxiaoqian726/articles/1923313.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值