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. IIS发布文件出现:未能加载文件或程序集“xxxx”或它的某一个依赖项。试图加载格式不正确的程序。

    解决方案:IIS——应用程序池—选中网站—高级设置——启用32位应用程序 :true.

  2. WIN7无法记住远程登录密码

    1.单点win7系统开始菜单——“运行”,然后输入“gpedit.msc”确定: 2.打开本地组策略后,依次展开:计算机配置 > 管理模板 > 系统 > 凭据分配: 3.双击右侧列表 ...

  3. hrbrid需要做的

    1 返回并刷新 A webveiw push 到 B webview.当由B返回到A时候, A需要刷新页面.

  4. 关于 JavaScript prototype __proto__ 一点总结

    http://www.cnblogs.com/wbin91/p/5265163.html 先上代码 function(y) Foo{ this.y = y;} Foo.prototype.x = 10 ...

  5. What is SPI?

    原文地址:http://www.fpga4fun.com/SPI1.html SPI is a simple interface that allows one chip to communicate ...

  6. Android中editText使用报错

    在activity_main.xml文件中添加了editText控件 <EditText        android:id="@+id/edit_text"        ...

  7. Table of Contents ---BCM

    Table of ContentsAbout This Document................................................................ ...

  8. SQL Server附加数据库出现错误5123的正确解决方法

    因为自己有一本基于SQL Server 2005的数据库教程,里边使用的示例数据库是AdventureWorks for SQL Server 2005,而我的机子上装的是SQL Server 200 ...

  9. VS中基于对话框的MFC利用换肤改变边框颜色及格式

    第一版本: http://ishare.iask.sina.com.cn/f/13836420.html?from=like 2. http://www.cnblogs.com/phinecos/ar ...

  10. bootstrap源码分析----栅格系统

    Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. bootstrap通过媒体查询解决不同分辨率屏幕下,页面主内 ...