基于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#程序设计的学习有所帮助。
热门推荐
10 小红书平安祝福语简短
11 生日祝福语大全女孩简短
12 收生日红包祝福语 简短
13 领证幽默祝福语简短
14 法考面试祝福语简短
15 老哥出门祝福语简短语
16 送灯祝福语简短独特
17 幼儿狗年祝福语大全简短
18 好听的元旦简短祝福语