C#编写的多生产者多消费者同步问题
生活随笔
收集整理的這篇文章主要介紹了
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){ //多個消費者,所以此處改用whileConsole.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);// 釋放鎖}//lockreturn 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 <= i && i < b) {Console.Write("{0,-9}",buffer[i]);}else if( b < a && !( b <= i && i < a ) ){Console.Write("{0,-9}",buffer[i]);}else if( occupiedBufferCount == BufferSize){Console.Write("{0,-9}",buffer[i]);}else{Console.Write("{0,-9}","");}}Console.WriteLine("{0}/r/n",occupiedBufferCount);} }class Producer{private HoldIntegerSynchronized sharedLocation;private Random randomSleepTime;public Producer(HoldIntegerSynchronized shared,Random random){sharedLocation = shared;randomSleepTime = random;}public void Produce(){for (int count=0; count<3; count++) {Thread.Sleep(randomSleepTime.Next(1,2000));sharedLocation.Buffer = randomSleepTime.Next(5,10);}Console.WriteLine(Thread.CurrentThread.Name + " done producing./r/nTerminating " + Thread.CurrentThread.Name + "./r/n");} }class Consumer{private HoldIntegerSynchronized sharedLocation;private Random randomSleepTime;public Consumer(HoldIntegerSynchronized shared,Random random){sharedLocation = shared;randomSleepTime = random;}public void Consume(){int sum = 0;for (int count=0; count<4; count++) {Thread.Sleep(randomSleepTime.Next(1,2000));sum += sharedLocation.Buffer;}Console.WriteLine(Thread.CurrentThread.Name + " read values totaling:" + sum + "/r/nTerminating " + Thread.CurrentThread.Name + ".");} }class SharedCell{static void Main(string[] args){HoldIntegerSynchronized holdInteger = new HoldIntegerSynchronized(5);Random random = new Random();Thread[] producerThreads = new Thread[4];Thread[] consumerThreads = new Thread[3];Console.Write("{0,-35}","Operation");for(int i = 0;i < holdInteger.BufferSize;i++){Console.Write("{0,-9}","Elem " + i);}Console.WriteLine("Occupied Count/r/n");for(int i = 0; i < producerThreads.Length;i++){Producer producer = new Producer(holdInteger,random);producerThreads[i] = new Thread(new ThreadStart(producer.Produce));producerThreads[i].Name = "Producer No." + i;}for(int i = 0; i < consumerThreads.Length;i++){Consumer consumer = new Consumer(holdInteger,random);consumerThreads[i] = new Thread(new ThreadStart(consumer.Consume));consumerThreads[i].Name = "Consumer No." + i;}for(int i = 0; i < producerThreads.Length;i++){producerThreads[i].Start();}for(int i = 0; i < consumerThreads.Length;i++){consumerThreads[i].Start();}} }
?
轉載于:https://www.cnblogs.com/gc2013/p/3959384.html
總結
以上是生活随笔為你收集整理的C#编写的多生产者多消费者同步问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄山风景区要提前买票吗
- 下一篇: 用百度直达号获取新用户 让顾客直达商家服