13

我对这些概念很陌生。但随着我越来越深入,threading我越来越困惑。

有什么意义mutexsemaphoreover autoresetevent

我通过研究了解到的唯一区别是mutex可以跨流程操作执行。如果是这种情况,为什么它没有与Set, Reset,相同的方法WaitOne

我们可以用AutoResetEventwith代替,mutex反之亦然吗?

请解决这个难题。

4

3 回答 3

23

不同的概念——aMutex是一个专属token;只有一个人可以拥有它;当他们释放它时,其他人可以争夺它。AnAutoResetEvent是一扇门,在关闭之前只允许一个人通过,并且由一个与想要通过的人的队列分开的按钮操作。当他们通过大门时,立即关闭。

于 2012-01-11T06:31:12.213 回答
3

这取决于。

通常,AutoResetEvent 和 Mutex 可以替换,AutoResetEvent.WaitOne = Mutex.WaitOne 和 AutoResetEvent.Set = Mutex.ReleaseMutex。

但它们是不同的。您可能会提到 Mutex 有一个“Release”,这意味着您可以在调用“WaitOne”时“得到”一些东西。您可能得到的东西与正在调用的线程有关。

您可以在任何线程中调用 AutoResetEvent.Set。但是您只能从名为 Mutex.WaitOne 的线程中调用 Mutex.ReleaseMutex 并获得 true 作为结果。

于 2019-07-24T06:40:51.910 回答
0

Mutex 正在阻止线程访问临界区;在 AutoResetEvent 中,我看到重点不是阻塞关键部分,而是它应该从任何其他线程接收的信号。一旦发出信号,就可以继续执行。

AutoResetEvent 还提供了一个处理竞争条件的选项,可以说首先调用 set() 事件,然后一些线程调用 wait() 然后 wait() 立即接收 set() 给出的信号,反之亦然也可以正常工作。

此外,如果在任何 wait() 之前调用了多个 set(),然后 wait() 到达,则多个 set() 将继续有效,只有一个 set() 可以等待 wait(),其余的将立即消失。

于 2021-09-01T16:15:59.443 回答