从未同步的代码块调用信号量 C# Object 同步方法

semaphores C# Object synchronization method was called from an unsynchronized block of code

我试图遵循与信号量有关的 pseudo-code 的一部分,当我将代码翻译成 C# 时,我在标题中遇到了错误。

经过一些研究,发生错误是因为我在同一线程中调用 cust_ready.ReleaseMutex() 而没有调用 cust_ready.WaitOne()。问题是这正是 pseudo-code 正在做的,所以我不确定如何解决这个问题?

cust_ready.WaitOne() 被调用但在一个单独的线程中,下面是有问题的伪代码:

线程 1:

wait(mutex2);

enqueue(custnr);

signal(cust_ready);

signal(mutex2);

线程 2:

wait(cust_ready);

wait(mutex2);

dequeuel(b_cust);

signal(mutex2);

这是我的 C# 代码:

线程 1:

mutex2.WaitOne();

customerQueue.Enqueue(custnr);

cust_ready.ReleaseMutex();

mutex2.ReleaseMutex();

线程 2:

cust_ready.WaitOne();

mutex2.WaitOne();

var exists = customerQueue.TryDequeue(out var b_cust);

mutex2.ReleaseMutex();

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();

相似主题Thread signaling basics

AutoResetEvent documentation - 备注部分提到了可用于在线程之间发出信号的其他对象。

我建议使用 ConcurrentQueue Class

All public and protected members of ConcurrentQueue are thread-safe and may be used concurrently from multiple threads.