【问题标题】:What happens to waiting threads if I call WaitHandle.Dispose()?如果我调用 WaitHandle.Dispose(),等待线程会发生什么?
【发布时间】:2009-08-17 14:01:49
【问题描述】:

我有两个 ManualResetEvents,用于在两个线程之间来回传递控制。本质上是一个协程。

因为协程持有一次性对象(ManualResetEvents 是等待句柄),它应该实现一次性。此外,它应该在处置时处置那些 ManualResetEvents。但是,因为一次只运行一个线程,其中一个(几乎)总是在等待其中一个句柄。

如果我同时处理 ManualResetEvents,指定的行为是什么?等待的线程会永远卡住,还是会终止等待?如果我先调用 .Set() 会怎样?

【问题讨论】:

    标签: .net multithreading idisposable


    【解决方案1】:

    暗示执行 ManualResetEvents 是不好的做法。 创建由事件拥有的supervisor类,并使用refcounter模式(每个线程增加/减少使用)在counter满足0时处理supervisor。

    【讨论】:

    • 我已经知道线程可以安全处理。问题实际上是执行处置。我需要保证没有线程死锁。
    • 处理事件的方式,当它被使用时,会在不同的平台或不同的 CPU 负载上授予不可预测的行为。但是应用正确的模式可以解决这个问题 - 不要在有可能使用的情况下处理事件。
    【解决方案2】:

    我最近遇到了类似的问题,并决定用监视器和 Marc Gravell herehere 描述的等待/脉冲模式替换等待句柄。因为监视器类是完全托管的,所以您不必担心释放任何资源。当然,您可能仍需要考虑关闭程序,但等待/脉冲模式对于添加关闭标志等内容更为灵活。

    【讨论】:

      猜你喜欢
      • 2016-01-10
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2012-09-11
      • 2020-08-24
      • 1970-01-01
      • 2012-03-24
      • 2021-10-13
      相关资源
      最近更新 更多