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[];
            for (int i = ; i < ; 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(, ));
            int beginNum = SharedResource1.Count;
            System.Console.WriteLine("线程 {0} 读到的起始值为 {1}  ", Thread.CurrentThread.ManagedThreadId, beginNum);
            for (int i = ; i < ; 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 = ;
    }
C# 使用AutoResetEvent进行线程同步的更多相关文章
- .net中的线程同步基础(搬运自CLR via C#)
		线程安全 此类型的所有公共静态(Visual Basic 中为 Shared)成员对多线程操作而言都是安全的.但不保证任何实例成员是线程安全的. 在MSDN上经常会看到这样一句话.表示如果程序中有n个 ... 
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
		[源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ... 
- 线程同步(AutoResetEvent与ManualResetEvent)
		前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ... 
- 线程同步 –AutoResetEvent和ManualResetEvent
		上一篇介绍了通过lock关键字和Monitor类型进行线程同步,本篇中就介绍一下通过同步句柄进行线程同步. 在Windows系统中,可以使用内核对象进行线程同步,内核对象由系统创建并维护.内核对象为内 ... 
- C#多线程之线程同步篇3
		在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ... 
- C#多线程之线程同步篇2
		在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ... 
- C#多线程之线程同步篇1
		在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ... 
- C# 线程同步的三类情景
		C# 已经提供了我们几种非常好用的类库如 BackgroundWorker.Thread.Task等,借助它们,我们就能够分分钟编写出一个多线程的应用程序. 比如这样一个需求:有一个 Winform ... 
- Java进击C#——语法之线程同步
		上一章我们讲到关于C#线程方向的应用.但是笔者并没有讲到多线程中的另一个知识点--同步.多线程的应用开发都有可能发生脏数据.同步的功能或多或少都会用到.本章就要来讲一下关于线程同步的问题.根据笔者这几 ... 
随机推荐
- SVN四部曲之SVN简单使用教程入门
			1. 签出源代码到本机 在本机创建文件夹StartKit,右键点击Checkout,弹出如下图的窗体: 2. 2 在上图中URL of Repository:下的文本框中输 ... 
- redis 界面软件使用
			ubuntu 下下载安装包 sudo dpkg -i redis-desktop-manager_0.8.3-120_amd64.deb//安装 redis-desktop-manager //启动 
- CentOS服务器Http压力测试之ab
			ab的全称是Apache Bench,是Apache自带的网络压力测试工具,相比于LR.JMeter,是我所知道的 Http 压力测试工具中最简单.最通用的. ab命令对发出负载的计算机要求很低,不会 ... 
- iOS:等比压缩截图代码
			将一幅图片按着需要的尺寸进行等比的压缩和放大,最后再截取需要尺寸部分,不知道说清楚没,反正就那意思吧! +(UIImage *)compressImageWith:(UIImage *)image w ... 
- c/c++常用代码--清空目录
			#pragma once #include <io.h>#include <stdio.h>#include <string>#include <direct ... 
- NGUI基础之button(按钮)
			1,button的创建:2,button组件的基本属性:3,button的事件监听 原位地址:http://blog.csdn.net/dingkun520wy/article/details/504 ... 
- 【狼窝乀野狼】Serializer妙手回春
			在我们很多程序中,需要将数据保存到本地,以便于下次打开还能看到原始数据.例如我们Xmind思维导图,例如我们的Power Designer等等,都是有保存一个隶属于自己的工程文件,那么今天我要说的就是 ... 
- JXL读取写入excel表格数据
			问题描述: 使用java的jxl包创建.写入excel表格数据 问题解决: (1)说明 (2)写入execel数据 注: 以上是写入数据需要调用的函数接口 注: 具体接口调用过程,如上所示 (3)读取 ... 
- Java多线程——<三>简单的线程执行:Executor
			一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个 ... 
- uva 12086 树状数组
			树状数组 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ... 
