两个提升的无锁队列会导致僵局
Can two boost lockfree queues cause deadlock
我的整体设计是要有多个生产者线程(> 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的大型输入。然后上面的循环停止将结果写入输出文件。制片人看到队列已经满了,再也无法推到队列。
当然,我的程序比上面要复杂得多。不确定我的问题来自使用两个队列。任何人在这种情况下都有任何经验。
评论一个队列后,我的问题仍然存在。因此,必须是其他地方导致交易锁定的地方。
即使使用锁定,容器也不共享锁定机制,因此不不会僵局。
但是,请记住,几个连续的原子操作不是整个原子,这是一个更大的问题,可能是您问题的原因。
相关文章:
- boost::进程间消息队列引发错误
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 在一个读写器队列中,我可以用volatile替换原子吗
- 为什么我的多线程作业队列崩溃
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 使用"Task"函数指针队列定义作业管理器
- 在c++队列中使用pop和visit实现线程安全
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 共享队列的线程安全
- 带自定义比较器的最小优先级队列
- 在 Vulkan Qt 中获取队列系列
- 堆栈和队列是否像C++中的数组一样传递?
- 在C++中创建队列 - 什么是 malloc 错误?
- 两个提升的无锁队列会导致僵局