【问题标题】:Can two boost lockfree queues cause deadlock两个boost无锁队列会导致死锁吗
【发布时间】:2019-03-15 22:55:49
【问题描述】:

我的总体设计是有多个生产者线程(>2)将结果生成为两个

   atomic<bool> processing_done=false; // when all producers finished
   // will set to true
   boost::lockfree::queue<ObjA, capacity<100>> Q1;
   boost::lockfree::queue<ObjB, capacity<100>> Q2;

   ==== code segment in a single writer thread ====
   while (!processing_done) {
      if (Q1.pop(bap)) {
          singleWrite.write(bap);
      }
      if (Q2.pop(pairbap)) {
          singleWriter.write(pairbap);
       }   
   }

两个队列都是无锁的,所以不应该有任何死锁问题。然而,我的程序愉快地运行了一段时间,处理了几乎 1/2 的大输入。然后上面的循环停止将结果写入输出文件。生产者看到队列已满,无法再向队列推送。

当然,我的程序比上面的要复杂得多。不确定我的问题来自使用两个队列。任何人在这种情况下都有任何经验。

注释掉一个队列后,我的问题仍然存在。所以一定是其他一些地方导致了deal lock。

【问题讨论】:

  • 了解processing_done 是什么、write 做什么以及write 中使用了何种同步会有所帮助。对write 的调用可能同时发生

标签: c++ multithreading boost queue lock-free


【解决方案1】:

即使有锁定,容器也不共享锁定机制,所以它们永远不会死锁。

但是,请记住,几个连续的原子操作作为一个整体并不是原子的,这是一个更大的问题,并且可能是您的问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多