C# 信号量不增加或减少

C# 信号量不增加或减少,c#,synchronization,semaphore,C#,Synchronization,Semaphore,我刚刚学习完信号量和同步,做了一个生产者-消费者实验,下面是C语言的代码# 使用系统; 使用系统线程; 使用System.Collections.Generic; 命名空间互斥实验{ 类程序{ 静态int MaxCount=>10; 私有静态互斥量Mutex=新互斥量(); //空缓冲区数 静态信号量lim Empty=>new(MaxCount,MaxCount); 静态信号量lim Full=>new(0,MaxCount); 静态队列缓冲区=>new(); 公共静态无效生成器(){ whi

我刚刚学习完信号量和同步,做了一个生产者-消费者实验,下面是C语言的代码#

使用系统;
使用系统线程;
使用System.Collections.Generic;
命名空间互斥实验{
类程序{
静态int MaxCount=>10;
私有静态互斥量Mutex=新互斥量();
//空缓冲区数
静态信号量lim Empty=>new(MaxCount,MaxCount);
静态信号量lim Full=>new(0,MaxCount);
静态队列缓冲区=>new();
公共静态无效生成器(){
while(true){
var pro=new Random().Next(01100);
空的。等待();
WriteLine($“Empty:{Empty.CurrentCount}”);
Mutex.WaitOne();
缓冲区排队(pro);
Mutex.ReleaseMutex();
完全释放();
WriteLine($“Full:{Full.CurrentCount}”);
WriteLine($“新产品:\t{pro}”);
睡眠(500);
}
}
公共静态无效使用者(){
while(true){
已满。等待();
Mutex.WaitOne();
var item=Buffer.Dequeue();
Mutex.ReleaseMutex();
Empty.Release();
WriteLine($“已消费:\t{item}”);
睡眠(500);
}
}
公共静态void Main(){
var producer=新线程(producer);
var consumer=新线程(consumer);
consumer.Start();
producer.Start();
Console.ReadKey();
}
}
}
我注意到每次
空的
满的
总是
10
0
,尽管我对其执行了
等待
释放

输出:


我做错了什么吗?

错误地将信号量作为只有getter的字段。
只要将它们更改为属性,它就会正常工作

静态信号量lim Empty=new(MaxCount,MaxCount);
静态信号量lim Full=new(0,MaxCount);
静态队列缓冲区=new();

您期望得到什么?当然,代码正在正常工作。每个信号量上只有一个线程在等待,线程之间相互协调,因此当每个线程都从等待中释放出来时,每个信号量当然会回到其原始状态。以上大概只是一个学术练习。对于简单的生产者/消费者场景,您应该使用<代码> BuffjCopys<代码>(对于更复杂的,考虑数据工作流API)。
Empty: 10
Full: 0
New production: 67
Empty: 10
Full: 0
New production: 64