Могут ли две очереди без блокировки увеличить - PullRequest
0 голосов
/ 16 марта 2019

Мой общий дизайн состоит в том, чтобы иметь несколько потоков производителей (> 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 голосов
/ 16 марта 2019

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

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

...