【问题标题】:Whats is the difference between AutoResetEvent and MutexAutoResetEvent 和 Mutex 有什么区别
【发布时间】:2012-01-11 06:27:07
【问题描述】:

我对这些概念不熟悉。但随着我对threading 的深入了解,我感到很困惑。

mutexsemaphoreautoresetevent有什么意义。

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

我们可以用mutex 替换AutoResetEvent,反之亦然吗?

请解开这个谜题。

【问题讨论】:

标签: c# multithreading mutex autoresetevent


【解决方案1】:

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

【讨论】:

  • 是的,但两者都解决了相同的目的。在某个时间点,只有一个人拥有钥匙。
  • @DJ 不,他们没有。没有人“拥有”AutoResetEvent 的“钥匙”;你排队,然后当大门打开时你通过。当你拿着一个键时,你不会得到一个时间区域。
  • 但如果我采取 ManualResetEvent。我想那么我们就有了钥匙。那么 Mutex 可以用 ManualResetEvent 代替吗?
  • @DJ 不,它不能。互斥锁的意义在于将互斥锁持续一段时间,例如进行一些需要将其视为单个单元的更改。虽然我们拥有它,但我们知道没有其他人这样做。自动重置事件不是这种情况; “打开”按钮可以通过任何代码按您喜欢的次数进行多次。没有“我完成了,回来了”,除非您的“正在执行”代码在退出时按下“打开”按钮,并且没有其他代码。但这不是自动重置事件的常见用法。
【解决方案2】:

视情况而定。

一般情况下,AutoResetEvent 和 Mutex 可以替换,AutoResetEvent.WaitOne = Mutex.WaitOne 和 AutoResetEvent.Set = Mutex.ReleaseMutex。

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

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

【讨论】:

    【解决方案3】:

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

    AutoResetEvent 还提供了一个处理竞态条件的选项,假设首先调用 set() 事件,然后一些线程调用 wait() 然后 wait() 立即接收 set() 给出的信号,反之亦然很好。

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

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      相关资源
      最近更新 更多