- 1、本文档共78页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【例13.0】 分析以下程序执行结果。 public class abcA, B { public A a; public B b; public void show() { MessageBox.Show(a.ToString() + ,+b.ToString()); } } public void add() //方法add() { int n; n = x; //取出x的值 n++; Thread.Sleep(r.Next(5,20)); //睡眠5~20ms x = n; //存回到x中 } public void sub() //方法sub() { int n; n = x; //取出x的值 n--; Thread.Sleep(r.Next(5,20)); //睡眠5~20ms x = n; //存回到x中 } } } 对这两个线程来说,x是共享变量。x的值应为1。 从中看到,x的可能结果为0、1或2,这显然是不正确的,原因是多个线程同时修改共享数据发生的错误。 根据lock语句,可将add()和sub()方法的代码修改如下 public void add() //方法add { int n; lock (this) { n = x; //取出x的值 n++; Thread.Sleep(r.Next(5, 20)); //睡眠5~20ms x = n; //存回到x中 } } public void sub() //方法sub { int n; lock (this) { n = x; //取出x的值 n--; Thread.Sleep(r.Next(5, 20)); //睡眠5~20ms x = n; //存回到x中 } } 图13.8 修改后Form3执行界面 2. 用Mutex类实现线程互斥 可以使用Mutex对象提供对资源的独占访问。线程调用mutex的WaitOne方法请求所有权。该调用会一直阻塞到mutex可用,或直至达到可选的超时间隔。 如果没有任何线程拥有它,则Mutex的状态为已发信号的状态。 线程通过调用ReleaseMutex方法释放mutex。mutex具有线程关联,即mutex只能由拥有它的线程释放。如果线程释放不是它拥有的mutex,则会在该线程中引发ApplicationException异常。 3. 用Monitor类实现线程互斥 Monitor类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。 当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用Monitor来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。 Monitor类的主要静态方法如下: Enter():获取对象锁。此操作同样会标记临界区的开头。其他任何线程都不能进入临界区,除非它使用其他锁定对象执行临界区中的指令。 Wait():释放对象上的锁以便允许其他线程锁定和访问该对象。在其他线程访问对象时,调用线程将等待。脉冲信号用于通知等待线程有关对象状态的更改。 Pulse():向一个或多个等待线程发送信号。该信号通知等待线程锁定对象的状态已更改,并且锁的所有者准备释放该锁。等待线程被放置在对象的就绪队列中以便它可以最后接收对象锁。一旦线程拥有了锁,它就可以检查对象的新状态以查看是否达到所需状态。 Exit():释放对象上的锁。此操作还标记受锁定对象保护的临界区的结尾。 public class Hockey : Sport //曲棍球类 { public Hockey() { name = 曲棍球; } public override string GetDuration() { return 两个半场,各分钟; } public override string GetName() { return name; } } public class Football : Sport //足球类 { public Football() { na
您可能关注的文档
- 必修1第3章金属及其化合物复习分解.ppt
- 必修1第二章第二节分解.ppt
- PICC维护分解.ppt
- 片式LED工艺流程2试题.ppt
- 必修2-第2章-第3节-反应速率和限度分解.ppt
- 片梭和递纬器设计试题.ppt
- 频谱仪的工作原理和使用方法试题.ppt
- 必修2第二章化学反应及其能量第三节化学反应的速率和限度分解.ppt
- 必修3第二章第1节《通过神经系统的调节》课时1分解.ppt
- 频数分布直方图和扇形统计图综合版试题.ppt
- 数据仓库:Redshift:Redshift与BI工具集成.docx
- 数据仓库:Redshift:数据仓库原理与设计.docx
- 数据仓库:Snowflake:数据仓库成本控制与Snowflake定价策略.docx
- 大数据基础:大数据概述:大数据处理框架MapReduce.docx
- 实时计算:GoogleDataflow服务架构解析.docx
- 分布式存储系统:HDFS与MapReduce集成教程.docx
- 实时计算:Azure Stream Analytics:数据流窗口与聚合操作.docx
- 实时计算:Kafka Streams:Kafka Streams架构与原理.docx
- 实时计算:Kafka Streams:Kafka Streams连接器开发与使用.docx
- 数据仓库:BigQuery:BigQuery数据分区与索引优化.docx
文档评论(0)