Мой общий дизайн состоит в том, чтобы иметь несколько потоков производителей (> 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);
}
}
Обе очереди свободны от блокировки, поэтому не должно быть никаких проблем с тупиковой блокировкой.Тем не менее, моя программа какое-то время успешно работала, обрабатывая почти половину большого ввода.Затем вышеприведенный цикл прекратил запись результатов в выходной файл.Производитель увидел, что очередь переполнена, и больше не мог переходить в очереди.
Конечно, моя программа намного сложнее, чем описанная выше.Не уверен, что моя проблема исходит от использования двух очередей.У любого есть опыт в таких ситуациях.
После комментирования одной очереди моя проблема все еще сохраняется.Так что, должно быть, некоторые другие места вызывают блокировку сделки.