AutoResetEvent 和 Mutex 有什么区别

问题描述 投票:0回答:3

我对这些概念很陌生。但当我深入

threading
时,我变得很困惑。

mutex
semaphore
相对于
autoresetevent
有何意义。

我通过研究了解到的唯一区别是

mutex
可以执行跨流程操作。如果是这种情况,为什么它没有与
Set
Reset
WaitOne
相同的方法。

我们可以将

AutoResetEvent
替换为
mutex
,反之亦然吗?

请解决这个难题。

c# multithreading mutex autoresetevent
3个回答
26
投票

不同的概念 -

Mutex
是专属代币;只有一个人可以拥有它;当他们释放它时,其他人就可以争夺它。
AutoResetEvent
是一扇在关闭前只允许一个人通过的大门,它由一个与想要通过的人队列分开的按钮操作。当他们通过大门时立即关闭。


4
投票

这要看情况。

一般来说,AutoResetEvent 和 Mutex 可以替换,AutoResetEvent.WaitOne = Mutex.WaitOne 和 AutoResetEvent.Set = Mutex.ReleaseMutex。

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.