当前位置: 编程技术>.net/c#/asp.net
基于C#实现的多生产者多消费者同步问题实例
来源: 互联网 发布时间:2014-11-03
本文导语: 本文实例讲述了基于C#实现的多生产者多消费者同步问题,分享给大家供大家参考之用。具体代码如下: // 多个生产者和多个消费者,能生产n个产品的情况 using System; using System.Threading; public class HoldIntegerSynchronized{ priv...
本文实例讲述了基于C#实现的多生产者多消费者同步问题,分享给大家供大家参考之用。具体代码如下:
// 多个生产者和多个消费者,能生产n个产品的情况 using System; using System.Threading; public class HoldIntegerSynchronized{ private int[] buffer; //缓冲区 private int occupiedBufferCount = 0; private int readPosition = 0 , writePosition = 0; //下一个读到的位置和写到的位置 public HoldIntegerSynchronized(int capacity){ buffer = new int[capacity]; } public int BufferSize{ get{ return buffer.Length; } } public int Buffer{ get{ int bufferCopy; // 加锁 lock(this){ while(occupiedBufferCount == 0){ //多个消费者,所以此处改用while Console.WriteLine(Thread.CurrentThread.Name + " tries to read. "); DisplayState("Buffer Empty. " + Thread.CurrentThread.Name + " waits."); Monitor.Wait(this); // 为临界区之外等待的生产者放行,让他来"生产" // 一直到生产者生产结束,调用了Monitor.PauseAll() // 才能继续执行下去,此时,消费者自动重新获得this的锁 } --occupiedBufferCount; bufferCopy = buffer[readPosition]; readPosition = (readPosition + 1) % buffer.Length; DisplayState(Thread.CurrentThread.Name + " reads " + bufferCopy); // 通知,让等待的 生产者线程 进入Started状态,如果生产者处于临界区之外,这句话执行完后他仍然在临界区之外 Monitor.PulseAll(this); // 释放锁 }//lock return bufferCopy; } set{ // 加锁 lock(this){ while(occupiedBufferCount == buffer.Length){ Console.WriteLine(Thread.CurrentThread.Name + " tries to write. "); DisplayState("Buffer Full. " + Thread.CurrentThread.Name + " waits."); Monitor.Wait(this); // 为临界区之外等待消费者放行,让他来"消费" // 一直到消费者调用了Monitor.Pause() // 才能继续执行下去,此时,生产者自动重新获得this的锁 } buffer[writePosition] = value; ++occupiedBufferCount; writePosition = (writePosition + 1) % buffer.Length; DisplayState(Thread.CurrentThread.Name + " writes " + value); // 通知,让Wait状态的 消费者 进入Started状态,如果消费者处于临界区之外,这句话执行完后他仍然在临界区之外 Monitor.PulseAll(this); // 释放锁 } } } public void DisplayState(string operation){ Console.Write("{0,-35}",operation); for(int i = 0; i < BufferSize; i++ ){ int a = readPosition; int b = writePosition; if( a