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