基于C#实现的多生产者多消费者同步问题实例
本文实例讲述了基于C#实现的多生产者多消费者同步问题,分享给大家供大家参考之用。具体代码如下:
//多个生产者和多个消费者,能生产n个产品的情况 usingSystem; usingSystem.Threading; publicclassHoldIntegerSynchronized{ privateint[]buffer;//缓冲区 privateintoccupiedBufferCount=0; privateintreadPosition=0,writePosition=0; //下一个读到的位置和写到的位置 publicHoldIntegerSynchronized(intcapacity){ buffer=newint[capacity]; } publicintBufferSize{ get{ returnbuffer.Length; } } publicintBuffer{ get{ intbufferCopy; //加锁 lock(this){ while(occupiedBufferCount==0){//多个消费者,所以此处改用while Console.WriteLine(Thread.CurrentThread.Name+"triestoread."); DisplayState("BufferEmpty."+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 returnbufferCopy; } set{ //加锁 lock(this){ while(occupiedBufferCount==buffer.Length){ Console.WriteLine(Thread.CurrentThread.Name+"triestowrite."); DisplayState("BufferFull."+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); //释放锁 } } } publicvoidDisplayState(stringoperation){ Console.Write("{0,-35}",operation); for(inti=0;i<BufferSize;i++){ inta=readPosition; intb=writePosition; if(a<=i&&i<b){ Console.Write("{0,-9}",buffer[i]); }elseif(b<a&&!(b<=i&&i<a)){ Console.Write("{0,-9}",buffer[i]); }elseif(occupiedBufferCount==BufferSize){ Console.Write("{0,-9}",buffer[i]); }else{ Console.Write("{0,-9}",""); } } Console.WriteLine("{0}/r/n",occupiedBufferCount); } } classProducer{ privateHoldIntegerSynchronizedsharedLocation; privateRandomrandomSleepTime; publicProducer(HoldIntegerSynchronizedshared,Randomrandom){ sharedLocation=shared; randomSleepTime=random; } publicvoidProduce(){ for(intcount=0;count<3;count++){ Thread.Sleep(randomSleepTime.Next(1,2000)); sharedLocation.Buffer=randomSleepTime.Next(5,10); } Console.WriteLine(Thread.CurrentThread.Name+"doneproducing./r/nTerminating"+Thread.CurrentThread.Name+"./r/n"); } } classConsumer{ privateHoldIntegerSynchronizedsharedLocation; privateRandomrandomSleepTime; publicConsumer(HoldIntegerSynchronizedshared,Randomrandom){ sharedLocation=shared; randomSleepTime=random; } publicvoidConsume(){ intsum=0; for(intcount=0;count<4;count++){ Thread.Sleep(randomSleepTime.Next(1,2000)); sum+=sharedLocation.Buffer; } Console.WriteLine(Thread.CurrentThread.Name+"readvaluestotaling:"+sum+"/r/nTerminating"+Thread.CurrentThread.Name+"."); } } classSharedCell{ staticvoidMain(string[]args){ HoldIntegerSynchronizedholdInteger=newHoldIntegerSynchronized(5); Randomrandom=newRandom(); Thread[]producerThreads=newThread[4]; Thread[]consumerThreads=newThread[3]; Console.Write("{0,-35}","Operation"); for(inti=0;i<holdInteger.BufferSize;i++){ Console.Write("{0,-9}","Elem"+i); } Console.WriteLine("OccupiedCount/r/n"); for(inti=0;i<producerThreads.Length;i++){ Producerproducer=newProducer(holdInteger,random); producerThreads[i]=newThread(newThreadStart(producer.Produce)); producerThreads[i].Name="ProducerNo."+i; } for(inti=0;i<consumerThreads.Length;i++){ Consumerconsumer=newConsumer(holdInteger,random); consumerThreads[i]=newThread(newThreadStart(consumer.Consume)); consumerThreads[i].Name="ConsumerNo."+i; } for(inti=0;i<producerThreads.Length;i++){ producerThreads[i].Start(); } for(inti=0;i<consumerThreads.Length;i++){ consumerThreads[i].Start(); } } }
希望本文所述对大家C#程序设计的学习有所帮助。