【问题标题】:Monitor.Enter and Monitor.Exit in different threadsMonitor.Enter 和 Monitor.Exit 在不同的线程中
【发布时间】:2012-06-12 17:29:45
【问题描述】:

Monitor.EnterMonitor.Exit 被设计为从同一个线程调用。但是,如果我需要在与获取的线程不同的线程中释放锁怎么办?

例如:有共享资源和使用该资源的异步操作。该操作以BeginOperation 开始,并获取共享资源上的锁。还有释放锁的EndOperation 方法。 EndOperation 通常在另一个线程中从回调中调用,因此我不能在 EndOperation 方法中调用 Monitor.Exit。在这种情况下,最好的方法是什么?使用AutoResetEvent 而不是Monitor 进行双重检查锁定会是一个好的解决方案吗?

【问题讨论】:

标签: c# .net multithreading locking


【解决方案1】:

您要查找的原语称为semaphore,可以安全地在一个线程上输入并从另一个线程退出。

【讨论】:

    【解决方案2】:

    如果您可以使用 .NET 4.0,您可以将其替换为 System.Threading.Semaphore,这允许您在一个线程中获取许可并在另一个线程中释放它们。

    Semaphore 类在调用时不强制执行线程标识 WaitOne 或 Release。

    【讨论】:

    • 如果线程 A 占用信号量中最后一个打开的插槽,而线程 B 发出释放信号……会发生什么?这是我在信号量中不了解的东西,也不知道如何/在哪里研究它。
    【解决方案3】:

    尝试使用ManualResetEvent,它用于阻止thead(s),直到某些外部事件被触发。 MSDN 文档:

    http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多