Могут ли две очереди boost lockfree вызвать взаимоблокировку

#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:

Даже при блокировке контейнеры не используют механизм блокировки совместно, поэтому они никогда не перейдут в взаимоблокировку.

Однако помните, что несколько последовательных атомарных операций не являются атомарными в целом, что является гораздо большей проблемой и, вероятно, причиной вашей проблемы.