信号量C#对象同步方法是从未同步的代码块调用的
我试图跟踪一段与信号量有关的伪代码,当我将代码翻译成C#时,我在标题中得到了错误 经过一些研究,出现了错误,因为我正在调用信号量C#对象同步方法是从未同步的代码块调用的,c#,multithreading,semaphore,C#,Multithreading,Semaphore,我试图跟踪一段与信号量有关的伪代码,当我将代码翻译成C#时,我在标题中得到了错误 经过一些研究,出现了错误,因为我正在调用cust\u ready.ReleaseMutex(),而没有在同一线程内调用cust\u ready.WaitOne()。问题是这正是伪代码所做的,所以我不知道如何解决这个问题 调用了cust_ready.WaitOne(),但在一个单独的线程中,下面是有问题的伪代码: 线程1: 等待(mutex2) 排队(客户编号) 信号(客户准备就绪) 信号(mutex2) 线程2:
cust\u ready.ReleaseMutex()
,而没有在同一线程内调用cust\u ready.WaitOne()
。问题是这正是伪代码所做的,所以我不知道如何解决这个问题
调用了cust_ready.WaitOne(),但在一个单独的线程中,下面是有问题的伪代码:
线程1:
等待(mutex2)
排队(客户编号)
信号(客户准备就绪)强>
信号(mutex2)
线程2:
等待(客户准备就绪)强>
等待(mutex2)
出列(b_cust)
信号(mutex2)
这是我的C代码:
线程1:
mutex2.WaitOne()
customerQueue.Enqueue(custnr)
cust_就绪。释放互斥()强>
mutex2.ReleaseMutex()
线程2:
cust_ready.WaitOne()强>
mutex2.WaitOne()
var exists=customerQueue.TryDequeue(out var b_cust)
mutex2.ReleaseMutex()
互斥体是一个同步访问资源的对象,您可以使用它来保护customerQueue。另一方面,互斥并不是用来发出信号的。要发出信号,您可以使用AutoResetEvent作为客户就绪状态 线程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();
类似话题
-备注部分提到了可用于在线程之间发送信号的其他对象。我建议使用
ConcurrentQueue的所有公共和受保护成员都是线程安全的,可以从多个线程并发使用
cust_ready不是互斥锁。生产者消费者支持在.NET中随时可用,请使用ConcurrentQueue或BlockingCollection。