Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
信号量C#对象同步方法是从未同步的代码块调用的_C#_Multithreading_Semaphore - Fatal编程技术网

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

信号量C#对象同步方法是从未同步的代码块调用的,c#,multithreading,semaphore,C#,Multithreading,Semaphore,我试图跟踪一段与信号量有关的伪代码,当我将代码翻译成C#时,我在标题中得到了错误 经过一些研究,出现了错误,因为我正在调用cust\u ready.ReleaseMutex(),而没有在同一线程内调用cust\u ready.WaitOne()。问题是这正是伪代码所做的,所以我不知道如何解决这个问题 调用了cust_ready.WaitOne(),但在一个单独的线程中,下面是有问题的伪代码: 线程1: 等待(mutex2) 排队(客户编号) 信号(客户准备就绪) 信号(mutex2) 线程2:

我试图跟踪一段与信号量有关的伪代码,当我将代码翻译成C#时,我在标题中得到了错误

经过一些研究,出现了错误,因为我正在调用
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。