- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * public void Fun2() { int k,n; for(k=0;k4;k++) {//如有线程进入此临界区,其他线程就不能进入这个临界区 lock(this) { n=num; //也不能进入前边的临界区 n++; Thread.Sleep(10); num=n; } Thread.Sleep(100); } } 编译运行,单击按钮标签控件应显示8。如果有多个共享数据区,使用此方法不太方便。 7.2.3 用Mutex类实现互斥 可以使用Mutex类对象保护共享资源(如上例中的总人数变量)不被多个线程同时访问。Mutex类WaitOne方法和ReleaseMutex方法之间代码是互斥体,这些代码要访问共享资源。Mutex类的WaitOne方法分配互斥体访问权,该方法只向一个线程授予对互斥体的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程用ReleaseMutex方法释放该互斥体。 【例7.6】使用Mutex类对象实现互斥。修改例7.4,为Form1类增加私有Mutex类变量:private Mutex mut。在Form1类构造函数中增加语句:mut=new Mutex();该句位置必须在建立线程语句之前。修改例7.4中的两个Fun1()和Fun2()方法如下: public void Fun1() { int k,n; for(k=0;k4;k++) { mut.WaitOne(); //等待互斥体访问权 n=num;// mut.WaitOne()和mut.ReleaseMutex()之间是互斥体 n++;//Mutex类对象mut的互斥体包含两部分,函数Fun1和Fun2中的互斥体 Thread.Sleep(10);//有线程进入一个互斥体,其他线程不能进入任何一个互斥体 num=n; mut.ReleaseMutex(); //释放互斥体访问权 Thread.Sleep(50); } }//退出该方法,线程结束 public void Fun2() { int k,n; for(k=0;k4;k++) { mut.WaitOne(); n=num; n++; Thread.Sleep(10); num=n; mut.ReleaseMutex(); Thread.Sleep(100); } } 编译,运行,标签控件显示8。如果有多个共享数据区,可以定义多个Mutex类对象。 7.2.4 用Monitor类实现互斥 也可以使用Monitor类保护共享资源不被多个线程或进程同时访问。Monitor类通过向单个线程授予对象锁来控制对对象的访问。只有拥有对象锁的线程才能执行临界区的代码,此时其他任何线程都不能获取该对象锁。只能使用Monitor类中的静态方法,不能创建Monitor类的实例。Monitor类中的静态方法主要有: 方法Enter:获取参数指定对象的对象锁。此方法放在临界区的开头。如其他线程已获取对象锁,则该线程将被阻塞,直到其他线程释放对象锁,才能获取对象锁。 方法Wait:释放参数指定对象的对象锁,以便允许其他被阻塞的线程获取对象锁。该线程进入等待状态,等待状态必须由其他线程用方法Pulse或PulseAll唤醒,使等待状态线程变为就绪状态。 方法Pulse和PulseAll:向等待线程队列中第一个或所有等待参数指定对象的对象锁的线程发送信息,占用对象锁的线程准备释放对象锁。执行方法Exit后将释放对象锁。 方法Exit:释放参数指定对象的对象锁。此操作还标记受对象锁保护的临界区的结尾。 使用Monitor类实现互斥也很简单,请读者修改例7_2_1,使用Monitor类实现互斥。Monitor类主要用来实现生产者和消费者关系中的线程的同步,具体例子见下一节。 7.3 生产者线程和消费者线程的同步 在生产者和消费者关系中,生产者线程产生数据,并把数据存到公共数据区,消费者线程使用数据,从公共数据区取出数据。显然如果公共数据区只能存一个数据,那么在消费者线程取出数据前,生产者线程不能放新数据到公共数据区,否则消费者线程将丢失数据。同样只有生产者线程把数据已经放到公共数据区,消费者线程才能取出数据,否则消费者线程不能取数据。这些就是所谓的生产者和消费者关系,必须要求生产者线程和消费者线程同步。 7.3.1 生产者线程和消费者线程不同步可能发生错误 【例7.7】下边的例子模拟生产者线程和消费者线程不同步可能发生错误。有一个公共变量,要求生产者线程顺序放1到4到这个公共变量中,每放一个变量,消费者线程取出这个数
您可能关注的文档
- 科学家的小故事大全讲述.doc
- 科学家怎样研究物质讲述.ppt
- 科学家的故事教案讲述.doc
- 第2章电力系统各元件的特性和数学模型详解.ppt
- 科学家的故事讲述.pptx
- 科学家的启示讲述.pptx
- 科学实验汇总讲述.doc
- 科学发展观讲课稿(最后定稿5552)4讲述.ppt
- 科学工作方法讲述.ppt
- 科学家PPT讲述.ppt
- 2025年网络文学平台版权运营模式创新与版权保护体系构建.docx
- 数字藏品市场运营策略洞察:2025年市场风险与应对策略分析.docx
- 全球新能源汽车产业政策法规与市场前景白皮书.docx
- 工业互联网平台安全标准制定:安全防护与合规性监管策略.docx
- 剧本杀剧本创作审核标准2025年优化与行业自律.docx
- 2025年新能源电动巡逻车在城市安防中的应用对城市环境的影响分析.docx
- 全渠道零售案例精选:2025年行业创新实践报告.docx
- 2025年网约车司乘纠纷处理机制优化与行业可持续发展报告.docx
- 2025年宠物烘焙食品市场法规政策解读:合规经营与风险规避.docx
- 2025年宠物行业数据安全监管政策影响分析报告.docx
文档评论(0)