C# Event 内核构造 |EventWaitHandle、AutoResetEvent、 ManualResetEvent
EventWaitHandle
继承:Object->WaitHandle-> EventWaitHandle
派生:System.Threading.AutoResetEvent\System.Threading.ManualResetEvent
AutoResetEvent、 ManualResetEvent只能在进程内使用。semaphore、mutex可以跨进程和线程使用。
使用内核对象记得及时释放句柄和对象。要不会造成内存浪费。
方法:
public static System.Threading.EventWaitHandle OpenExisting (string name);
1、EventWaitHandle.OpenExisting(String eventName) 静态方法,跨进程使用。判段已知的名称的自动事件是否存在
public static bool TryOpenExisting (string name, out System.Threading.EventWaitHandle? result);
1、EventWaitHandle.OpenExisting(String eventName) 静态方法,跨进程使用。判段已知的名称的自动事件是否存在,存在返回true。
AutoResetEvent
只能在进程内使用。
创建自动事件的2种方式:
1、EventWaitHandle clearCount = new EventWaitHandle(false, EventResetMode.AutoReset);
2、AutoResetEvent are =new AutoResetEvent(true);//默认打开自动砸门,它自能唤醒一个阻塞线程,在解除第一个阻塞后,内核将事件重置为false,所以第一次waitone()不会阻塞,第二次会阻塞。
方法:
1、EventWaitHandle.OpenExisting(String eventName) 静态方法,跨进程使用。判段已知的名称的自动事件是否存在
用AutoResetEvent实现一个类似于metux的锁。
AutoMutex am=new AutoMutex();
for (int i = 0; i < 10; i++)
{
new Thread(() => {
am.Enter(); Thread.Sleep(1000);
am.Release(); }).Start();
} class AutoMutex
{ static AutoResetEvent are =new AutoResetEvent(true);
static int lockOwner=-1;//当前锁的拥有者
static int recursionCount=-1;//迭代计数器 public void Enter()
{
int currentcount = Environment.CurrentManagedThreadId;
if (lockOwner == currentcount)
{ recursionCount++;
return;
} are.WaitOne();
Console.WriteLine("Current Thread{0}", Environment.CurrentManagedThreadId);
recursionCount = 1;
lockOwner = currentcount;
}
public void Release()
{
if (lockOwner == Environment.CurrentManagedThreadId) return;
if(--recursionCount == 0)
{
are.Set();
lockOwner = -1;
} } public void Dispose()
{ are.Close();
are.Dispose();
} }
ManualResetEvent
只能在进程内使用。
创建手动事件的2种方式:
1\EventWaitHandle clearCount =new EventWaitHandle(false, EventResetMode.ManualReset);
2\ManualResetEvent are =new ManualResetEvent(true);//默认打开自动砸门,所以 waitone()不会阻塞,必须手动关闭。
方法:
1、EventWaitHandle.OpenExisting(String eventName) 静态方法,跨进程使用。判段已知的名称的自动事件是否存在
C# Event 内核构造 |EventWaitHandle、AutoResetEvent、 ManualResetEvent的更多相关文章
- 【深度好文】多线程之WaitHandle-->派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent
AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- AutoResetEvent ManualResetEvent WaitOne使用注意事项
公司还用这些老家伙没办法,用了几次这俩.每次用都要重新翻一下A片. 好好的A片楞是翻译成了禅经.把这东西弄成个玄学.微软也是吃枣药丸.参考了@风中灵药的blog.写的牛逼. 还有一些公司用到的风中灵药 ...
- [.net 多线程]AutoResetEvent, ManualResetEvent
ManualResetEvent: 通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源. Set() : 用于向 ManualResetEvent 发送信号 ...
- linux内核构造skb发包-----raw、tcp网络编程
1. 内核raw发包 #include <linux/init.h>#include <linux/module.h> #include <linux/kernel.h& ...
- C#线程学习笔记五:线程同步--事件构造
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Event_Constructor.html,记录一下学习过程以备后续查用. 前面讲的线 ...
- .NET中的线程与异步(笔记)
翻出了之前记录的笔记,基本涵盖了.NET中线程和异步的相关概念.可以提供一个学习的方向. 线程类型 工作者线程IO线程 线程池 全局队列(QueueUserWorkItem.Timer总是放入全局)本 ...
- Daemon,Jos,定时器
--> FileSystemWatcher--> EventWaitHandle / AutoResetEvent / ManualResetEvent--> Mutex--> ...
- 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent
本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...
随机推荐
- NAO机器人开发环境配置
python python2.7用于NAO开发 https://www.python.org/downloads/release/python-2718/ python3.6用于其他程序测试. htt ...
- 1.IO流
1.组成部分 File.FileInputStream.FileOutStream.FileWriter.FileReader 2.File pathSeparatorChar ; separator ...
- DataTable 中文国际化
DataTable中文设置,详见代码 1 var table = $('#example').DataTable({ 2 "language": { 3 "process ...
- MySQL函数学习(一)-----字符串函数
一.MySQL 字符串函数 \ 函 数 名 称 作 用 完 成 1 LENGTH 计算字符串字节长度 勾 2 CONCAT 合并字符串函数,返回结果为连接参数产生的字符串,参数可以是一个或多个 勾 3 ...
- Servlet-通过继承HttpServlet类实现Servlet程序
通过继承HttpServlet类实现Servlet程序(开发一般用) 一般在实际项目开发中,都是使用继承 HttpServlet类的方式实现Servlet程序 1,编写一个类去继承 HttpServl ...
- 【Vulnhub靶场】JANGOW: 1.0.1
时隔这么久,终于开始做题了 环境准备 下载靶机,导入到virtualBox里面,这应该不用教了吧 开机可以看到,他已经给出了靶机的IP地址,就不用我们自己去探测了 攻击机IP地址为:192.168.2 ...
- python浮点数计算--5
#!/usr/bin/python #coding=utf-8 i=1.0 j=3 print(i*j) print(i+j) print(i**j) 备注:无论是哪种运算,只要有操作数是浮点数,py ...
- db2日志模式、备份归档、恢复解析
DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...
- Vue 之 vue-cropper 组件实现头像裁剪功能
组件与api地址: npm地址地址:https://www.npmjs.com/package/vue-cropper/v/0.4.7 GitHub地址:https://github.com/xyxi ...
- MySQL 行锁、表锁
1. 多个事务操作同一行数据时,后来的事务处于阻塞等待状态.这样可以避免了脏读等数据一致性的问题.后来的事务可以操作其他行数据,解决了表锁高并发性能低的问题 2.InnoDB的行锁是针对索引加的锁,不 ...