知识大全 C#多线程学习—生产者和消费者(2)
Posted 知
篇首语:一切节省,归根到底都归结为时间的节省。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#多线程学习—生产者和消费者(2)相关的知识,希望对你有一定的参考价值。
C#多线程学习—生产者和消费者(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Monitor 类锁定一个对象
当多线程公用一个对象时 也会出现和公用代码类似的问题 这种问题就不应该使用lock关键字了 这里需要用到System Threading中的一个类Monitor 我们可以称之为监视器 Monitor提供了使线程共享资源的方案
Monitor类可以锁定一个对象 一个线程只有得到这把锁才可以对该对象进行操作 对象锁机制保证了在可能引起混乱的情况下一个时刻只有一个线程可以访问这个对象
Monitor必须和一个具体的对象相关联 但是由于它是一个静态的类 所以不能使用它来定义对象 而且它的所有方法都是静态的 不能使用对象来引用 下面代码说明了使用Monitor锁定一个对象的情形
……
Queue oQueue=new Queue() ……
Monitor Enter(oQueue) ……//现在oQueue对象只能被当前线程操纵了 Monitor Exit(oQueue) //释放锁
如上所示 当一个线程调用Monitor Enter()方法锁定一个对象时 这个对象就归它所有了 其它线程想要访问这个对象 只有等待它使用 Monitor Exit()方法释放锁 为了保证线程最终都能释放锁 你可以把Monitor Exit()方法写在try catch finally结构中的finally代码块里
对于任何一个被Monitor锁定的对象 内存中都保存著与它相关的一些信息 其一是现在持有锁的线程的引用 其二是一个预备队列 队列中保存了已经准备好获取锁的线程 其三是一个等待队列 队列中保存著当前正在等待这个对象状态改变的队列的引用
当拥有对象锁的线程准备释放锁时 它使用Monitor Pulse()方法通知等待队列中的第一个线程 于是该线程被转移到预备队列中 当对象锁被释放时 在预备队列中的线程可以立即获得对象锁
下面是一个展示如何使用lock关键字和Monitor类来实现线程的同步和通讯的例子 也是一个典型的生产者与消费者问题
这个例程中 生产者线程和消费者线程是交替进行的 生产者写入一个数 消费者立即读取并且显示(注释中介绍了该程序的精要所在)
用到的系统命名空间如下 using System using System Threading
首先 定义一个被操作的对象的类Cell 在这个类里 有两个方法 ReadFromCell()和WriteToCell 消费者线程将调用 ReadFromCell()读取cellContents的内容并且显示出来 生产者进程将调用WriteToCell()方法向 cellContents写入数据
public class Cell int cellContents; // Cell对象里边的内容 bool readerFlag = false; // 状态标志 为true时可以读取 为false则正在写入 public int ReadFromCell( ) lock(this) // Lock关键字保证了什么 请大家看前面对lock的介绍 if (!readerFlag)//如果现在不可读取 try //等待WriteToCell方法中调用Monitor Pulse()方法 Monitor Wait(this); catch (SynchronizationLockException e) Console WriteLine(e); catch (ThreadInterruptedException e) Console WriteLine(e); Console WriteLine( Consume: cellContents); readerFlag = false; //重置readerFlag标志 表示消费行为已经完成 Monitor Pulse(this); //通知WriteToCell()方法(该方法在另外一个线程中执行 等待中) return cellContents; public void WriteToCell(int n) lock(this) if (readerFlag) try Monitor Wait(this); catch (SynchronizationLockException e) //当同步方法(指Monitor类除Enter之外的方法)在非同步的代码区被调用 Console WriteLine(e); catch (ThreadInterruptedException e) //当线程在等待状态的时候中止 Console WriteLine(e); cellContents = n; Console WriteLine( Produce: cellContents); readerFlag = true; Monitor Pulse(this); //通知另外一个线程中正在等待的ReadFromCell()方法 cha138/Article/program/net/201311/15297相关参考
C#多线程学习—生产者和消费者(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
Java多线程--生产者与消费者 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 模拟生产者与消费
由生产者/消费者问题看JAVA多线程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 生产者消费者
/*@authorshijin*生产者与消费者模型中要保证以下几点*同一时间内只能有一个生产者生产 生产方法加锁sychronized*同一时间内只能
Java多线程例子 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 写出一组模拟生产者/消费者的协
C#创建多线程应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在NET和C#中编写一个多
C#多线程编程实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问题的提出 所谓单个写入程序
详细讲解C#的多线程能力 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 线程是允许进行并行计算的
C#多线程中lock的用法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 经常碰到同时需要对某个
C#中构建多线程应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 引言 随着双核四核等多