从未同步的代码块调用信号量 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.
我试图遵循与信号量有关的 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.