C#线程同步自动重置事件——AutoResetEvent
AutoResetEvent对象用来进行线程同步操作,AutoResetEvent类继承waitHandle类。
AutoResetEvent对象有终止和非终止两种状态,终止状态是线程继续执行,非终止状态使线程阻塞,可以调用set和reset方法使对象进入终止和非终止状态。AutoResetEvent顾名思义,其对象在调用一次set之后会自动调用一次reset,进入非终止状态使调用了等待方法的线程进入阻塞状态。
waitHandle对象的waitone可以使当前线程进入阻塞状态,等待一个信号。直到当前 waitHandle对象收到信号,才会继续执行。
set可以发送一个信号,允许一个或多个因为调用waitone而等待线程继续执行,经实验,如果有多个等待的线程,一次set只能让一个线程继续执行。
reset可以使因为调用waitone而等待线程都进入阻塞状态。
下面的例子是启动了两个线程,用AutoResetEvent对象来让他们阻塞或者继续。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace myTest
{
class Program
{
const int numIterations = ;
//initialState 若要一开始就是阻塞的,则设为false,一开始是非阻塞的,则设为true。
static AutoResetEvent myResetEvent = new AutoResetEvent(false);
static int number=; static void Main(string[] args)
{
Thread myReaderThread = new Thread(new ThreadStart(MyReadThreadProc));
myReaderThread.Name = "ReaderThread";
myReaderThread.Start();
Thread myReaderThread2 = new Thread(new ThreadStart(MyReadThreadProc2));
myReaderThread2.Name = "ReaderThread2";
myReaderThread2.Start();
//myResetEvent.Reset(); // 设为终止状态,让 waitone的线程阻塞
for (int i = ; i <= numIterations; i++)
{ Console.WriteLine("Writer thread writing value: {0}", i);
number = i;
//将事件状态设置为终止状态,允许一个或多个等待线程继续。
myResetEvent.Set();
Thread.Sleep();
myResetEvent.Set();
//休息一下,让线程1和2来得及执行
Thread.Sleep(); }
myReaderThread.Abort();
Console.ReadLine();
}
static void MyReadThreadProc()
{
while (true)
{
// 阻止当前线程,直到 Threading.waitHandler 收到一次信号
myResetEvent.WaitOne();
Console.WriteLine("Thread1: {0} reading value: {1}", Thread.CurrentThread.Name, number);
}
}
static void MyReadThreadProc2()
{
while (true)
{
// 阻止当前线程,直到 Threading.waitHandler 收到一次信号
myResetEvent.WaitOne();
Console.WriteLine(DateTime.Now.ToString());
Console.WriteLine("Thread2:{0} reading value: {1}", Thread.CurrentThread.Name, number);
}
}
}
}
执行结果:

在结果中可以看到,如果有多个线程等待,每次set之后只有一个线程继续执行,且继续执行的线程是随机的。
C#线程同步自动重置事件——AutoResetEvent的更多相关文章
- C#线程同步手动重置事件——ManualResetEvent
和AutoResetEvent类的区别是,Manual一旦set后不会自动reset,会放行所有waitone的线程,而autoresetevent每一次set之后只会放行一个waitone的线程,然 ...
- 线程同步中使用信号量AutoResetEvent
using System; using System.Threading; namespace ConsoleApplication1 { class Program { static void Ma ...
- window下线程同步之(Event Objects(事件))
Event 方式是最具弹性的同步机制,因为他的状态完全由你去决定,不会像 Mutex 和 Semaphores 的状态会由类似:WaitForSingleObject 一类的函数的调用而改变,所以你可 ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- 《Windows核心编程系列》八谈谈用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- Windows编程之线程同步
本笔记整理自:<Windows核心编程(第五版)> 目录 什么是线程同步 用户方式中的线程同步 原子访问:Interlocked系列函数 CRITICAL_SECTION:关键段 内核对象 ...
- 线程同步 –AutoResetEvent和ManualResetEvent
上一篇介绍了通过lock关键字和Monitor类型进行线程同步,本篇中就介绍一下通过同步句柄进行线程同步. 在Windows系统中,可以使用内核对象进行线程同步,内核对象由系统创建并维护.内核对象为内 ...
- C#线程学习笔记五:线程同步--事件构造
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Event_Constructor.html,记录一下学习过程以备后续查用. 前面讲的线 ...
- 转:VC++线程同步-事件对象
这是整理孙鑫VC得到的关于线程同步方面的笔记. n 事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于 ...
随机推荐
- 模块化管理工具兼打包工具 webpack
webpack 是一个[模块化管理工具]兼[打包工具] 是一个工具(和seajs,requirejs管理前端模块的方式是不一样) 在webpack一个文件就是一个模块! seajs,requirejs ...
- Ambari组件黄色预警
Ambari组件黄色预警 组件上为黄色问号,代表心跳丢失,解决如下: 1. 查看个节点之间是否可以相互通信,若ssh连接不上,有可能是该节点关机了,没有打开,手动开启该节点,再次验证是否可互通. 2 ...
- flex弹性盒模型布局
容器属性:1.flex-direction:项目的排列方向(1)row 主轴方向排列(2)row-reverse 主轴反方向排列(3)column 纵向排列(4)column-reverse 纵向反方 ...
- 正则表达式preg_replace中危险的/e修饰符带来的安全漏洞问题
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) /e 修饰符使 preg_rep ...
- 关于click和submit的笔记
click主要用于元素的点击时的响应事件,而submit是指表单元素form的提交事件. 但是,当click加入到表单的提交按钮时,事情似乎就有点复杂,总是忘记了.这两天搜了下,又实践了一下. 主要用 ...
- bzoj1510: [POI2006]Kra-The Disks(单调栈)
这道题可以O(n)解决,用二分还更慢一点 维护一个单调栈,模拟掉盘子的过程就行了 #include<stdio.h> #include<string.h> #include&l ...
- 一台linux真实机实现多台Tomcat服务
一.事前准备 ü 确保linux并未安装tomcat (这里虚拟机测试) ü 下载jdk与tomcat ① jdk-6u18-ea-bin-b01-linux-i586-20_aug_2009.bin ...
- Struts2标签大全
A:<s:a xhref=""></s:a>-----超链接,类似于html里的<a></a><s:action name=& ...
- WPF之命令浅谈
一.认识命令 1.1命令的特点 提到“命令”,我们应该想到命令的发出者,命令的接受者,命令的内容,准备工作,完成任务,回报工作...与事件中的发送者,接受者,消息,处理,处理,处理一一对应,如果是单纯 ...
- MYSQL INNODB PAGE一督
MYSQL INNODB PAGE一督