我对这些概念很陌生。但随着我越来越深入,threading
我越来越困惑。
有什么意义mutex
,semaphore
over autoresetevent
。
我通过研究了解到的唯一区别是mutex
可以跨流程操作执行。如果是这种情况,为什么它没有与Set
, Reset
,相同的方法WaitOne
。
我们可以用AutoResetEvent
with代替,mutex
反之亦然吗?
请解决这个难题。
我对这些概念很陌生。但随着我越来越深入,threading
我越来越困惑。
有什么意义mutex
,semaphore
over autoresetevent
。
我通过研究了解到的唯一区别是mutex
可以跨流程操作执行。如果是这种情况,为什么它没有与Set
, Reset
,相同的方法WaitOne
。
我们可以用AutoResetEvent
with代替,mutex
反之亦然吗?
请解决这个难题。
不同的概念——aMutex
是一个专属token;只有一个人可以拥有它;当他们释放它时,其他人可以争夺它。AnAutoResetEvent
是一扇门,在关闭之前只允许一个人通过,并且由一个与想要通过的人的队列分开的按钮操作。当他们通过大门时,立即关闭。
这取决于。
通常,AutoResetEvent 和 Mutex 可以替换,AutoResetEvent.WaitOne = Mutex.WaitOne 和 AutoResetEvent.Set = Mutex.ReleaseMutex。
但它们是不同的。您可能会提到 Mutex 有一个“Release”,这意味着您可以在调用“WaitOne”时“得到”一些东西。您可能得到的东西与正在调用的线程有关。
您可以在任何线程中调用 AutoResetEvent.Set。但是您只能从名为 Mutex.WaitOne 的线程中调用 Mutex.ReleaseMutex 并获得 true 作为结果。
Mutex 正在阻止线程访问临界区;在 AutoResetEvent 中,我看到重点不是阻塞关键部分,而是它应该从任何其他线程接收的信号。一旦发出信号,就可以继续执行。
AutoResetEvent 还提供了一个处理竞争条件的选项,可以说首先调用 set() 事件,然后一些线程调用 wait() 然后 wait() 立即接收 set() 给出的信号,反之亦然也可以正常工作。
此外,如果在任何 wait() 之前调用了多个 set(),然后 wait() 到达,则多个 set() 将继续有效,只有一个 set() 可以等待 wait(),其余的将立即消失。