两个提升无锁队列会导致死锁吗

时间:2019-03-15 22:55:49

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

我的总体设计是使用多个生产者线程(> 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的大型输入。然后,上述循环停止将结果写入输出文件。生产者看到队列已满,无法再将其推入队列。

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

注释掉一个队列后,我的问题仍然存在。因此必须是其他一些地方导致交易锁定。

1 个答案:

答案 0 :(得分:2)

即使具有锁定功能,容器也不共享锁定机制,因此它们永远不会死锁。

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