#c #multithreading #boost #queue #lock-free
#c #многопоточность #boost #очередь #без блокировки
Вопрос:
Мой общий дизайн заключается в том, чтобы иметь несколько потоков-производителей (> 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. Это помогло бы узнать, что
processing_done
есть, чтоwrite
делает и какой тип синхронизации используется вwrite
. Возможно, что вызовыwrite
выполняются одновременно
Ответ №1:
Даже при блокировке контейнеры не используют механизм блокировки совместно, поэтому они никогда не перейдут в взаимоблокировку.
Однако помните, что несколько последовательных атомарных операций не являются атомарными в целом, что является гораздо большей проблемой и, вероятно, причиной вашей проблемы.