- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程的同步控制-网络教育精品资源共享课-上海交通大学
* 应用软件开发(C#) 第9章 多线程 第9章 多线程 王德俊 上海交通大学继续教育学院 第9章 多线程 9.1 线程及其实现方法 9.2 线程的同步控制 9.2 线程的同步控制 9.2.1 为什么要同步控制 9.2.2 使用ManualResetEvent类 9.2.3 使用AutoResetEvent类 9.2.1 为什么要同步控制 线程之间由于共享资源而产生相互之间需要互相等待、互通消息才能正确地完成任务,此时就需要相应的同步控制机制来支持线程的合作关系。 【例9.1】 存在同步访问问题的多线程程序。如下:创建控制台应用程序BankTransfering,简单地模拟银行用户进行转帐和取款的程序: class Bank { private double account1 = 2500; private double account2 = 1000; public void transfering() //转帐 { Console.WriteLine(转帐前帐户account1还剩余的金额: + account1.ToString()); Console.Write(转帐金额(元):); double sum = double.Parse(Console.ReadLine()); //输入转帐金额 if (sum account1) { Console.WriteLine(转帐金额超出了帐户account1所剩的金额,+转帐失败!); return; } account1 = account1 - sum; account2 = account2 + sum; Console.WriteLine(转帐后帐户account1还剩余的金额: + account1.ToString()); } 9.2 线程的同步控制 9.2.1 为什么要同步控制 public void fetching() //取款 { Thread.Sleep(100); account1 = account1 - 2000; //取款2000元 } } static void Main(string[] args) { Bank a = new Bank(); Thread user1 = new Thread(new ThreadStart(a.transfering)); Thread user2 = new Thread(new ThreadStart(a.fetching)); user1.Start(); user2.Start(); Console.ReadKey(); } 9.2 线程的同步控制 9.2.1 为什么要同步控制 9.2 线程的同步控制 9.2.1 为什么要同步控制 程序运行结果如图: 分析:user1查询帐户account1时,显示了还剩2500元的信息,但在执行从account1向account2转2000元时,却出现了操作失败的提示。 其原因:恰好在user1等待接收从键盘输入的转帐金额时,user2从帐户account1上提走了2000元。 结论:需要同步控制 ManualResetEvent类的作用是:通知一个或多个正在等待的线程已发生事件。 ManualResetEvent类对象有两种状态:有信号状态和无信号状态。状态常通过两种方法设置: 一种是使用构造函数, 例如: ManualResetEvent mre = new ManualResetEvent( false); //初始化mre为无信号状态 ManualResetEvent mre = new ManualResetEvent(true); //初始化mre为有信号状态 另一种是使用对象方法, 例如: mre.Reset(); //使mre处于无信号状态
文档评论(0)