关于AutoResetEvent 和ManualResetEvent
在公司的代码里面看到这两个类的使用了,第一次去msdn上的时候,看的一头雾水(关键是没有找对方法)
http://www.cnblogs.com/qingyun163/archive/2013/01/05/2846633.html 这篇博客应该会有些帮助的
这次看的比较仔细,懂得看一个类的时候,可以去找它的父类。
发现AutoResetEvent 和ManualResetEvent 全部都继承自EventWaitHandle类
EventWaitHandle中有介绍EventResetMode 这个枚举类型
// 摘要:
// 指示在接收信号后是自动重置 System.Threading.EventWaitHandle 还是手动重置。
[ComVisible(false)]
public enum EventResetMode
{
// 摘要:
// 当终止时,System.Threading.EventWaitHandle 在释放一个线程后自动重置。如果没有等待的线程,System.Threading.EventWaitHandle
// 将保持终止状态直到一个线程阻止,并在释放此线程后重置。
AutoReset = ,
//
// 摘要:
// 当终止时,System.Threading.EventWaitHandle 释放所有等待的线程,并在手动重置前保持终止状态。
ManualReset = ,
}
using System;
using System.Threading; namespace MyEventResetMode
{
class Program
{
/// <summary>
/// EventWaitHandle变量 可以赋值AutoReset和ManualReset
/// </summary>
private static EventWaitHandle ewh; /// <summary>
/// 线程的计数器 在进入线程后加1 释放线程后减1
/// </summary>
private static long threadCount = ; /// <summary>
/// 让主线程阻塞的 EventWaitHandle 到所有开辟出来的线程全部被释放
/// </summary>
private static EventWaitHandle clearCount = new EventWaitHandle(false, EventResetMode.AutoReset); static void Main(string[] args)
{
//创建一个AutoReset类型的EventWaitHandle
ewh = new EventWaitHandle(false, EventResetMode.AutoReset); //创建5个线程,将i作为参数传递,以识别不同的线程
for (int i = ; i <= ; i++)
{
Thread t = new Thread(
new ParameterizedThreadStart(ThreadProc)
);
t.Start(i);
Thread.Sleep();//确保线程是有先后顺序的 方便后面判断AutoReset是否随机释放单个线程
} while (Interlocked.Read(ref threadCount) < )//等待所有的线程启动并阻塞
{
Thread.Sleep();
} Console.WriteLine(); while (Interlocked.Read(ref threadCount) > )//逐个释放ewh阻塞的线程
{
Console.WriteLine("Press ENTER to release a waiting thread.");
Console.ReadLine(); WaitHandle.SignalAndWait(ewh, clearCount);//向一个 WaitHandle 发出信号并等待另一个。 相当于下面两个语句
/*
ewh.Set();//收到信号之后,随机释放一个被它阻塞的线程,其它的保持阻塞
clearCount.WaitOne();//阻塞
*/
//ewh是要发出信号的WaitHandle, ewh收到信号之后,释放单个线程,然后再自动阻塞
//clearCount是要等待的WaitHandle clearCount在此等待 相当于调用了clearCount.WaitOne(); }
Console.WriteLine(); //创建一个ManualReset类型的EventWaitHandle
ewh = new EventWaitHandle(false, EventResetMode.ManualReset); //创建5个线程,将i作为参数传递,以识别不同的线程
for (int i = ; i <= ; i++)
{
Thread t = new Thread(
new ParameterizedThreadStart(ThreadProc)
);
t.Start(i);
} while (Interlocked.Read(ref threadCount) < )//等待所有线程启动并阻塞
{
Thread.Sleep();
} Console.WriteLine("Press ENTER to release the waiting threads.");
Console.ReadLine();
ewh.Set(); //一次释放所有被它阻塞的线程 Console.Read();
} public static void ThreadProc(object data)
{
int index = (int)data; Interlocked.Increment(ref threadCount);//计数增加
Console.WriteLine("Thread {0} blocks.", data);
ewh.WaitOne();//等待ewh发出信号 Console.WriteLine("Thread {0} exits.", data);
Interlocked.Decrement(ref threadCount);//计数减少 clearCount.Set();//释放主线程一次
}
}
}
EventWaitHandle需要注意的是,如果初始设置为false,那么就会阻塞线程。
如果初始为true,AutoReset会先释放掉等待线程中的任意一个,其他的线程仍保持阻塞。如果初始为true,ManualReset不会阻塞,直接释放掉所有的线程。
关于AutoResetEvent 和ManualResetEvent的更多相关文章
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析
AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...
- 个人对AutoResetEvent和ManualResetEvent的理解(转载)
仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...
- AutoResetEvent和ManualResetEvent理解 z
AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandle,API相同,但在使用中还是有区别的. 每次使用时虽然理解了,但由于没有去 ...
- C#AutoResetEvent和ManualResetEvent的区别
一:终止状态和非终止状态 首先说说线程的终止状态和非终止状态.AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态.true表示 ...
- 线程同步(AutoResetEvent与ManualResetEvent)
前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...
- AutoResetEvent与ManualResetEvent区别
本文来自:http://www.360doc.com/content/10/1126/10/3267996_72536817.shtml 在.Net多线程编程中,AutoResetEvent和Manu ...
- WaitHandle、AutoResetEvent、ManualResetEvent
多线程中的锁系统(三)-WaitHandle.AutoResetEvent.ManualResetEvent 介绍 本章主要说下基于内核模式构造的线程同步方式,事件,信号量. 目录 一:理论 二:Wa ...
- 对比AutoResetEvent和ManualResetEvent
ManualResetEvent和AutoResetEvent 比较 ManualResetEvent和AutoResetEvent都继承自EventWaitHandler,它们的唯一区别就在于父类 ...
- c# AutoResetEvent和ManualResetEvent
网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...
随机推荐
- 科普HTTP Slow Attack 和 Apache DOS 漏洞的修复
导读 HTTP 的 Slow Attack 有着悠久历史的 HTTP DOS 攻击方式,最早大约追溯到 5 年前,按理说早该修复了,但是 Apache 的默认配置中仍然没有添加相关配置,或者他们认为这 ...
- Python 之定时器
#引入库 threading import threading #定义函数 def fun_timer(): print('hello timer') #打印输出 global timer #定 ...
- 170713、springboot编程之多数据源切换
我们在开发过程中可能需要用到多个数据源,我们有一个项目(MySQL)就是和别的项目(SQL Server)混合使用了.其中SQL Server是别的公司开发的,有些基本数据需要从他们平台进行调取,那么 ...
- 热词统计以及Quartz.net的简单使用
一.热词统计 方案一: 设计一个表:ID KeyWord Count 当用户再输入框中查询的时候,我们就往表中插入数据,在插入之前首先判断是否已经存在keyword,存在的话,让C ...
- javascript 知道这20个正则表达式,能让你少写1,000行代码
正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于 ...
- wireshark, loopback
swapondd if=/dev/zero of=/data/mnt/swap bs=1024 count=8024000 sudo apt-get install wireshark sudo gr ...
- 利用burpsuite实现重放攻击
1.什么是重放攻击? 顾名思义,重复的会话请求就是重放攻击.可能是因为用户重复发起请求,也可能是因为请求被攻击者获取,然后重新发给服务器. 附上详细的解释:http://blog.csdn.net/k ...
- 动态修改Python类和实例的方法(转)
相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不满足需求的方法.比如说下面这个例子. class Dog: def bark(self): p ...
- day11(jsp入门&Cookie&HttpSession&一次性图片校验码)
day11 JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. ...
- 预训练模型与Keras.applications.models权重资源地址
什么是预训练模型 简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型.你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手. ...