ManualResetEvent类,用于通知一个或多个正在等待的线程已发生事件,它有2种状态:有信号(true)的无信号(false)。

有2种方法可以设置它的信号状态:构造函数构造的时候设置或者通过对象方法设置:

ManualResetEvent mutex=new ManualResetEvent(true/false);//初始化一种状态
mutex.Reset();//设置mutex为无信号
mutex.Set();//设置mutex为有信号

多线程同步控制例子:

namespace BankTransfering2
{
class Bank
{
private double account1 = ;
private double account2 = ;
ManualResetEvent[] mres = { new ManualResetEvent(false),
new ManualResetEvent(false)
}; //创建包含两个ManualResetEvent类对象的数组 public void transfering() //将100元从帐户account1转到帐户account2
{
mres[].Reset();
account1 = account1 - ;
Thread.Sleep();
account2 = account2 + ;
mres[].Set();
}
public void transfering2() //将300元从帐户account2转到帐户account1
{
mres[].Reset();
account1 = account1 + ;
Thread.Sleep();
account2 = account2 - ;
mres[].Set();
}
public void querying() //查询帐户account1和account2上的余额
{
mres[].WaitOne();//等待transfering的信号
mres[].WaitOne();//等待transfering2的信号
       //只有当2个信号都为true时,说明它们都运行完了,这个时候query才运行
//WaitHandle.WaitAll(mres);
Console.WriteLine("帐户account1上的余额为:{0} 元", account1);
Console.WriteLine("帐户account2上的余额为:{0} 元", account2);
}
}
class Program
{
static void Main(string[] args)
{
Bank a = new Bank();
Thread user1 = new Thread(new ThreadStart(a.transfering)); //转帐用户1
Thread user2 = new Thread(new ThreadStart(a.transfering2)); //转帐用户2
Thread user3 = new Thread(new ThreadStart(a.querying)); //查账用户
user1.Start(); //执行转帐(account1到account2)
user2.Start(); //执行转帐(account2到account1)
user3.Start(); //查账用户
Console.ReadKey();
}
}
}

account1要向account2转钱,transfering是1转向2,transfering2是2转向1。query是查询两人账户状态。

三条线程并发执行的时候,查询操作必须要等transfering和transfering2都没有在执行动作的时候才能准确查到账户余额,transfering和transfering2在执行操作的时候对相应的信号量置为false,执行完动作后又将其置为true。而query必须要等两个信号量为true的时候才能执行(信号量改变的时候会有机制唤醒正在等待的线程,我猜的.....)

												

C#线程同步控制的更多相关文章

  1. Python的并发并行[1] -> 线程[3] -> 多线程的同步控制

    多线程的控制方式 目录 唤醒单个线程等待 唤醒多个线程等待 条件函数等待 事件触发标志 函数延迟启动 设置线程障碍 1 唤醒单个线程等待 Condition类相当于一把高级的锁,可以进行一些复杂的线程 ...

  2. JAVA中的线程安全与非线程安全

    原文:http://blog.csdn.net/xiao__gui/article/details/8934832 ArrayList和Vector有什么区别?HashMap和HashTable有什么 ...

  3. Python线程模块threading

    线程,程序执行的最小单元,单线程处理多个任务只能一个处理完后继续处理下一个直到全部处理完,多线程处理任务会比单线程处理起来快吗?在python程序里得看情况,首先有GIL锁的存在导致同一时刻只能有一个 ...

  4. 线程ThreadDemo04

    package day190109; public class 线程ThreadDemo04 { public static void main(String[] args) throws Inter ...

  5. php Pthread 线程 互斥锁

    在进行并发操作时,会导致共享数据的完整性的问题,要加入锁,在任意时刻只有一个线程访问该对象在PHP中定义专门用于线程同步控制的mutex的函数, pthreads v3 中已经将 Mutex 类移除. ...

  6. 线程同步 – lock和Monitor

    在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...

  7. 基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)

    需求背景 利用线程来模拟生产者和消费者模型 系统建模 这个系统涉及到三个角色,生产者,消费者,任务队列,三个角色之间的关系非常简单,生产者和消费者拥有一个任务队列的引用,生产者负责往队列中放置对象(i ...

  8. Java线程安全和非线程安全

    ArrayList是非线程安全的,Vector是线程安全的:HashMap是非线程安全的,HashTable是线程安全的:StringBuilder是非线程安全的,StringBuffer是线程安全的 ...

  9. 零基础逆向工程38_Win32_12_信号量_线程控制小结

    1 信号量 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.[百度百科] 1.1 创建信号量 HANDLE Create ...

随机推荐

  1. jQuery校验validate详解(转)

    jQuery校验 官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一导入js库 <script src=&q ...

  2. Calendar获取星期

    Calendar的使用举个小栗子: //通过当前时间获取本周周一时间 Date date = new Date(); Calendar calendar = new GregorianCalendar ...

  3. Linux手动释放内存

    手动释放内存 1.sync将内存中的缓存写入磁盘 2.  to free pagecache, use echo 1 > /proc/sys/vm/drop_caches;       to f ...

  4. cut命令

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn] [f ...

  5. require.js 入门笔记

    网站越来越庞大,JS也是越写越多. 当所有的JS 都集中在 HTML的 head 部分时,网页加载变得很慢,很多的 JS代码也并不是全都适用在当前的页面,造成了代码的冗余度非常高. 而且长长的JS代码 ...

  6. VUE 入门基础(4)

    四,计算属性 基础例子 <div id='example'> <p>0riginal message: "{{message}}"</p> &l ...

  7. PHP简单利用token防止表单重复提交

    <?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_S ...

  8. cocos2d-js callFunc传参

    1.传递一个参数: pg.TestScene.prototype.init = function () { if (cc.Scene.prototype.init.call(this)) { var ...

  9. jQuery控件有所感悟

    两种写法对比: 第一种: ;(function($){ $.fn.myplugin = function(op,params){ if (typeof op == 'string'){ return ...

  10. mac 查看无线wifi的密码

    finder->应用程序->实用工具->钥匙串访问->右上角输入wifi名查找->显示密码(需要管理员账号)