两个提升的无锁队列会导致僵局

Can two boost lockfree queues cause deadlock

本文关键字:队列 僵局 两个      更新时间:2023-10-16

我的整体设计是要有多个生产者线程(> 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);
       }   
   }

两个队列都是无锁的,因此不应有任何Deadloack问题。但是,我的程序愉快地运行了一段时间,处理了将近1/2的大型输入。然后上面的循环停止将结果写入输出文件。制片人看到队列已经满了,再也无法推到队列。

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

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

即使使用锁定,容器也不共享锁定机制,因此不不会僵局。

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