C# 使用AutoResetEvent进行线程同步
AutoResetEvent 允许线程通过发信号互相通信。 通常,当线程需要独占访问资源时使用该类。
线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。 如果 AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。
调用 Set 向 AutoResetEvent 发信号以释放等待线程。 AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。 如果没有任何线程在等待,则状态将无限期地保持为终止状态。如果当 AutoResetEvent 为终止状态时线程调用 WaitOne,则线程不会被阻止。 AutoResetEvent 将立即释放线程并返回到非终止状态。
AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只有继续等待.也就是说,AutoResetEvent一次只唤醒一个线程.
static AutoResetEvent a = new AutoResetEvent(false);//WaitOne会阻止false,但是不会阻止true,内部自动reset了public static void MainTest(){Thread[] ths = new Thread[4];for (int i = 0; i < 4; i++){ths[i] = new Thread(increaseCount);ths[i].Start();} a.Set();//如果是非终止状态,一定要在这里Set下,不然线程一直处于等待状态System.Console.ReadKey();}static void increaseCount(){a.WaitOne();//当得到信号后,内部又将状态设置为非终止状态,相当于独占了。Random ran = new Random();Thread.Sleep(ran.Next(100, 5000));int beginNum = SharedResource1.Count;System.Console.WriteLine("线程 {0} 读到的起始值为 {1} ", Thread.CurrentThread.ManagedThreadId, beginNum);for (int i = 0; i < 10000; i++){beginNum++;}SharedResource1.Count = beginNum;System.Console.WriteLine("线程 {0} 结束,SharedResource.Count={1}", Thread.CurrentThread.ManagedThreadId, SharedResource1.Count);a.Set();}}class SharedResource1{public static int Count = 0; }
C# 使用AutoResetEvent进行线程同步相关推荐
- 线程同步-AutoResetEvent
线程同步的其他方式: 1.AutoResetEvent 使用WaitOne和set 进行阻塞和释放阻塞的线程, WaitOne方法定义: public virtual bool WaitOne(int ...
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...
- 改善C#程序的建议6:在线程同步中使用信号量
所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CL ...
- C#线程同步的几种方法
在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...
- C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- C#多线程编程实战(二):线程同步
2.1 简介 竞争条件:多个线程同时使用共享对象.需要同步这些线程使得共享对象的操作能够以正确的顺序执行 线程同步问题:多线程的执行并没有正确的同步,当一个线程执行递增和递减操作时,其他线程需要依次等 ...
- 细说C#多线程那些事 - 线程同步和多线程优先级
上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...
- 多线程(6)线程同步
使用多线程很容易,但是如果多个线程同时访问一个共享资源时而不加以控制,就会导致数据损坏.所以多线程并发时,必须要考虑线程同步(或称线程安全)的问题. 什么是线程同步 多个线程同时访问共享资源时,使多 ...
- C#中的多线程-线程同步基础 (控制线程数量)
同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成 锁系统 构成 目的 跨进程? 速度 loc ...
最新文章
- pygame做一个简单的打字游戏
- IBM Watson将成为失败的投资?分析师眼里, IBM AI过度乐观, 夸大宣传
- jqurey操作select 语法解释
- IBM一周内拥有10万Lotus Symphony用户
- java泛型反映调用方法体内类型引用问题
- 用javascript自制ctf词频分析工具
- Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))
- 2019蓝桥杯省赛b组
- NIOS2-IDE环境下的一些操作技巧
- Boolean.getBoolean()和Boolean.parseBoolean()
- 【软件使用技巧】一(截图)
- 知识图谱 - 知识体系构建与知识融合
- Android编译libjpeg-turbo so高效压缩图片
- c语言 画图软件哪个好,电脑画图软件推荐
- 夜神模拟器android版本修改器,夜神模拟器怎么用 夜神安卓模拟器使用方法大大全...
- 【今日CV 计算机视觉论文速览】Wed, 27 Feb 2019
- 预测房价实验-房价数据集
- Git 团队协作机制
- opencc对文档的繁体中文转换为简体
- 一文读懂 HTTP(超文本传输)协议