信号量C#对象同步方法是从未同步的代码块中调用的



我试图遵循一段与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的所有公共和受保护成员都是线程安全的,可以从多个线程并发使用。

最新更新