当前位置: 首页 > backend >正文

线程同步之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

http://www.xdnf.cn/news/11494.html

相关文章:

  • 易语言入门知识点
  • Android基础教程(非常详细)从零基础入门到精通,看完这一篇就够了
  • Amazon S3简介
  • Sniffer Pro使用详解
  • WINDOWS API ——CREATEMUTEX——创建互斥对象(转)
  • 易语言_酷Q机器人插件_01
  • 离线浏览器Teleport Pro完全教程
  • XML 简介
  • 分享130个ASP整站程序源码,总有一款适合您
  • 【C语言进阶剖析】22.C语言中的条件编译使用分析
  • Windows Server安装SQL Server 2008 R2
  • euphoria游戏资源_游戏资源合集(一)——乙女游戏篇
  • 有关一级域名二级域名三级域名
  • Broadcast(广播)和BroadcastReceiver(广播接收器)
  • Web 四种常见的POST提交数据方式
  • texttospeech的使用
  • objectArx ---反应器
  • JAVA开发环境配置(保姆式教程)
  • 代码的两种命名方法:驼峰命名、匈牙利命名(优缺点)
  • ADB安装及使用详解(非常详细)从零基础入门到精通,看完这一篇就够了_adb是什么
  • 关于qt缺少xcb问题终极解决办法
  • android 使用SQLite数据库详解
  • HIS系统门急诊医保实时结算接口测试
  • 倍投计算机器在线,2021看图开特马50研究计算倍投【欢迎你】
  • css设置滚动条样式
  • 网络管理与维护基本知识
  • android x86怎么样,Android x86 4.4安装体验(转载)
  • nii与nii.gz格式的关系
  • DWZ简介以及使用
  • csdn是什么