代码之家  ›  专栏  ›  技术社区  ›  Xaqron

线程切换和死锁预防问题

  •  0
  • Xaqron  · 技术社区  · 14 年前

    // member variable
    object _syncLock = new object();
    
    void Wait()
    {
       lock (_syncLock)
          {
             Monitor.Pulse(_syncLock);
             Monitor.Wait(_syncLock);
          }
    }
    

    这里不可能两个线程都处于等待状态。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Reed Copsey    14 年前

    这似乎过于复杂了。首先要正确地处理锁,并避免这个问题。如果只有两个线程,并且它们试图获得相同的单锁(正确),那么就不应该有死锁。死锁意味着这里发生了其他事情。

    也就是说,如果您可以选择通过.NET 4(或.NET 3.5上的Rx扩展)使用TPL,那么您可能需要考虑使用 BlockingCollection<T>

        2
  •  1
  •   Brian Gideon    14 年前

    如果您的意图是创建生产者-消费者模式的成对变体,那么序列是 Pulse 之前 Wait 等待 之前 脉搏 Joe Duffy's article on this . 但是,请记住,由于他的实现执行无条件的 等待 Enqueue 1个 等待 方法使其更像一个真正的FIFO缓冲区。

    然而,像里德一样,我质疑为什么 BlockingCollection 无法使用。此集合应该非常有效,因为它使用了 Add Take 方法。当然,就像我前面提到的,如果你真的想要成对的变体,那么这个集合将不能满足你的需求,你将不得不以Joe Duffy's作为出发点来滚动你自己的。

    1个 只要记住使用 while if 在应用等待之前检查。 Monitor.Wait 只需等待锁状态的改变,就可以了,所以您必须重新检查等待条件。