我的总体设计是使用多个生产者线程(> 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的大输入。然后上面的循环停止将结果写入输出文件。生产者看到队列已满,无法再推送到队列。
当然,我的程序要比上面复杂得多。不确定我的问题是来自使用两个队列。任何人都有这种情况的经验。
在评论出一个队列后,我的问题仍然存在。所以必须是其他一些地方导致交易锁定。
即使使用锁定,容器也不会共享锁定机制,因此它们永远不会死锁。
但是,请记住,几个连续的原子操作不是原子的整体,这是一个更大的问题,可能是你的问题的原因。