博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#线程同步控制
阅读量:4358 次
发布时间:2019-06-07

本文共 2309 字,大约阅读时间需要 7 分钟。

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

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

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

多线程同步控制例子:

namespace BankTransfering2{    class Bank    {        private double account1 = 2500;        private double account2 = 1000;        ManualResetEvent[] mres = { new ManualResetEvent(false),                                     new ManualResetEvent(false)                                   };  //创建包含两个ManualResetEvent类对象的数组        public void transfering()    //将100元从帐户account1转到帐户account2        {            mres[0].Reset();            account1 = account1 - 100;            Thread.Sleep(100);            account2 = account2 + 100;            mres[0].Set();        }        public void transfering2()    //将300元从帐户account2转到帐户account1        {            mres[1].Reset();            account1 = account1 + 300;            Thread.Sleep(200);            account2 = account2 - 300;            mres[1].Set();        }        public void querying()    //查询帐户account1和account2上的余额        {            mres[0].WaitOne();//等待transfering的信号            mres[1].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的时候才能执行(信号量改变的时候会有机制唤醒正在等待的线程,我猜的.....)

 

 

转载于:https://www.cnblogs.com/muyoucai/p/6257112.html

你可能感兴趣的文章
一步一步写算法(之hash表)
查看>>
漫谈并发编程(一) - 并发简单介绍
查看>>
JDBC连接MySQL数据库及演示样例
查看>>
Beta 冲刺(1/7)
查看>>
修改 Vultr 登录密码
查看>>
CSS学习
查看>>
Centos 安装lnmp完整版
查看>>
【转】Eclipse和PyDev搭建完美Python开发环境(Ubuntu篇)
查看>>
redis安装和配置
查看>>
2016424王启元 Exp5 msf基础应用
查看>>
android + eclipse + 后台静默安装(一看就会)
查看>>
JPA事务总结
查看>>
transitionFromView方法的使用
查看>>
Differences between page and segment
查看>>
Jdk与Tomcat配置与安装
查看>>
关于一个Java web与JFrame的深度结合
查看>>
VB连数据库conn.open的参数
查看>>
《信息安全系统设计基础》实验三
查看>>
SpringBoot Docs
查看>>
解决sublime text 2总是在新窗口中打开文件(标签中打开)
查看>>