我试图遵循一段与Semaphores有关的伪代码,当我将代码翻译成C#时,标题中出现了错误。
经过一些研究,错误发生了,因为我在同一线程中调用cust_ready.ReleaseMutex()
而没有调用cust_ready.WaitOne()
。问题是,这正是伪代码所做的,所以我不确定如何解决这个问题?
cust_ready.WaitOne()
被调用,但在一个单独的线程中,下面是有问题的伪代码:
威胁1:
等待(互斥2(;
入队(保管人(;
信号(cust_ready(
信号(互斥2(;
线程2:
等待(cust_ready(
等待(互斥2(;
出列(b_cust(;
信号(互斥2(;
这是我的C#代码:
威胁1:
互斥2.WaitOne((;
customerQueue.Enqueue(custnr(;
cust_ready.ReleaseMutex((
互斥2.释放互斥((;
线程2:
cust_ready.WaitOne((
互斥2.WaitOne((;
var exists=customerQueue.TryDequeue(出var b_cust(;
互斥2.释放互斥((;
Mutex是一个同步访问资源的对象,您可以使用它来保护customerQueue。另一方面,互斥锁并不是用来发出信号的。要发出信号,您可以使用AutoResetEvent作为cust_ready。
威胁1
mutex2.WaitOne();
customerQueue.Enqueue(custnr);
cust_ready.Set();
mutex2.ReleaseMutex();
威胁2
cust_ready.WaitOne();
mutex2.WaitOne();
var exists = customerQueue.TryDequeue(out var b_cust);
mutex2.ReleaseMutex();
类似主题线程信号基础
AutoResetEvent文档-备注部分提到了可用于在线程之间发出信号的其他对象。
我建议使用ConcurrentQueue类。
ConcurrentQueue的所有公共和受保护成员都是线程安全的,可以从多个线程并发使用。