线程同步的其他方式:

1、AutoResetEvent

使用WaitOne和set 进行阻塞和释放阻塞的线程,

WaitOne方法定义:

public virtual bool WaitOne(int millisecondsTimeout);该方法用来阻塞线程,当在指定的时间间隔还没有收到一个信号时,将返回false。

public AutoResetEvent(bool initialState); 当initialState值为false时线程阻塞等待set信号或者等待超时时间结束,当为true时不进行线程阻塞。

millisecondsTimeout 为超时时间  当设置的超时时间到时 无论是否收到了set的信号 线程将解除阻塞的状态立即执行 WaitOne的返回值为false  当收到set的信号解除线程阻塞时返回值为true。

例子:

using System;
using System.Threading;namespace KenelMode
{class Program{// 初始化自动重置事件,并把状态设置为非终止状态// 如果这里把初始状态设置为True时,// 当调用WaitOne方法时就不会阻塞线程,看到的输出结果的时间就是一样的了// 因为设置为True时,表示此时已经为终止状态了。       public static AutoResetEvent autoEvent = new AutoResetEvent(false);static void Main(string[] args){Console.WriteLine("Main Thread Start run at: " +DateTime.Now.ToLongTimeString());Thread t = new Thread(TestMethod);t.Start();// 阻塞主线程1秒后// 调用 Set方法释放线程,使线程t可以运行Thread.Sleep(3000);// Set 方法就是把事件状态设置为终止状态。autoEvent.Set();Console.Read();}public static void TestMethod(){if (autoEvent.WaitOne(2000)){Console.WriteLine("Get Singal to Work");// 3秒后线程可以运行,所以此时显示的时间应该和主线程显示的时间相差一秒Console.WriteLine("Method Restart run at: " + DateTime.Now.ToLongTimeString());}else{Console.WriteLine("Time Out to work");Console.WriteLine("Method Restart run at: " + DateTime.Now.ToLongTimeString());}}}
}

2、信号量(Semaphore)

信号量(Semaphore)是由内核对象维护的int变量,当信号量为0时,在信号量上等待的线程会堵塞,信号量大于0时,就解除堵塞。当在一个信号量上等待的线程解除堵塞时,内核自动会将信号量的计数减1。在.net 下通过Semaphore类来实现信号量同步。

Semaphore类限制可同时访问某一资源或资源池的线程数。线程通过调用 WaitOne方法将信号量减1,并通过调用 Release方法把信号量加1

class Program{// 初始信号量计数为0,最大计数为10public static Semaphore semaphore =new Semaphore(0,10);public static int time = 0;static void Main(string[] args){for (int i = 0; i < 5; i++){Thread test = new Thread(new ParameterizedThreadStart(TestMethod));// 开始线程,并传递参数test.Start(i);}// 等待1秒让所有线程开始并阻塞在信号量上Thread.Sleep(500);// 信号量计数加4// 最后可以看到输出结果次数为4次semaphore.Release(4);Console.Read();         }public static void TestMethod(object number){// 设置一个时间间隔让输出有顺序int span = Interlocked.Add(ref time, 100);Thread.Sleep(1000 + span);//信号量计数减1semaphore.WaitOne();Console.WriteLine("Thread {0} run ", number);}}

  

 3、 Mutex 使用Mutex.WaitOne()和Mutex.ReleaseMutex();

转载于:https://www.cnblogs.com/dghwey/p/5026177.html

线程同步-AutoResetEvent相关推荐

  1. C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent

    C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...

  2. C# 使用AutoResetEvent进行线程同步

    AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...

  3. 改善C#程序的建议6:在线程同步中使用信号量

    所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CL ...

  4. C#线程同步的几种方法

    在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...

  5. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  6. C#多线程编程实战(二):线程同步

    2.1 简介 竞争条件:多个线程同时使用共享对象.需要同步这些线程使得共享对象的操作能够以正确的顺序执行 线程同步问题:多线程的执行并没有正确的同步,当一个线程执行递增和递减操作时,其他线程需要依次等 ...

  7. 细说C#多线程那些事 - 线程同步和多线程优先级

    上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...

  8. 多线程(6)线程同步

    使用多线程很容易,但是如果多个线程同时访问一个共享资源时而不加以控制,就会导致数据损坏.所以多线程并发时,必须要考虑线程同步(或称线程安全)的问题.  什么是线程同步 多个线程同时访问共享资源时,使多 ...

  9. C#中的多线程-线程同步基础 (控制线程数量)

    同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成 锁系统 构成 目的 跨进程? 速度 loc ...

最新文章

  1. oracle中有类似split的方法么,ORACLE中字符串split的一种方法
  2. python subplot_气象编程 | 一个简单的风数据处理和分析案例(Python版)
  3. 奇怪的Residential Gateway Device设备
  4. SQL Profile (总结4)--使用演示示例
  5. 如何调节idea jvm的最大内存_那个小白还没搞懂内存溢出,只能用案例说给他听了
  6. 我37岁,从互联网大厂跳槽到国企后,发现没有一劳永逸的工作。。。
  7. 老旧笔记本电脑变服务器(笔记本电脑+内网穿透)
  8. 常用视频质量评价库以及下载地址
  9. Linux网络流量控制工具—Netem
  10. 根据身份证号(18/15)计算年龄、出生日期、性别
  11. zblogphp登录和注册_zblog如何设置会员注册功能
  12. Pytorch:optim.zero_grad()、pred=model(input)、loss=criterion(pred,tgt)、loss.backward()、optim.step()的作用
  13. 求生之路2 服务器 修改难度,求生之路2服务器指令及难度参数设置
  14. 新浪微博定位页面代码解析
  15. 视觉SLAM十四讲读书笔记(2)P10-P27
  16. 杭州高级职称申报通过率如何提升?
  17. 滴水逆向 C语言基础学习
  18. 3.Hadoop Hive服务
  19. 某个袁 对 TypeScript 索引签名 理解
  20. 模拟实现msn登陆过程(MSNP15)

热门文章

  1. WIN32开发:如何获取父进程的ID
  2. SAP BAPI的一些初级资料
  3. .Net中删除数据前进行外键冲突检测
  4. Hibernate程序性能优化的考虑要点
  5. how to rank conferences or journals?
  6. csdn的自动化评论
  7. unity安装,sdk,jdk问题
  8. C#开发VS LUA开发
  9. Unity 协程Coroutine综合测试
  10. 【转】c#中类的默认访问修饰符