почему concurrent_queue не блокирует? - PullRequest
15 голосов
/ 13 октября 2010

В среде выполнения параллелизма, представленной в VS2010, есть класс concurrent_queue. Имеет неблокирующую функцию try_pop ().
Аналогично в Intel Thread Building Blocks (TBB), блокирующий вызов pop () был удален при переходе с версии 2.1 на 2.2.

Интересно, в чем проблема с блокирующим вызовом? Почему он был удален из TBB? И почему нет блокировки concurrent_queue?

Я нахожусь в ситуации, когда мне нужна блокирующая параллельная очередь, и я не хочу занятого ожидания. Помимо написания очереди самостоятельно, есть ли еще одна возможность во время выполнения параллелизма?

Ответы [ 4 ]

26 голосов
/ 13 октября 2010

С комментарий от Арка Робисона , и он не получает намного больше "рта лошади" , чем (a) :


У PPL concurrent_queue нет блокирующего всплывающего окна, следовательно, и у tbb::strict_ppl::concurrent_queue нет. Блокировка всплывающих окон доступна в tbb::concurrent_bounded_queue.

Аргумент конструкции для исключения блокировки блокируется тем, что во многих случаях синхронизация для блокировки обеспечивается за пределами очереди, и в этом случае реализация блокировки внутри очереди становится ненужной служебной информацией.

С другой стороны, популярность блокировки tbb::concurrent_queue была популярна среди пользователей, у которых не было внешней синхронизации.

Итак, мы разделили функциональность. Сценарии использования, которые не нуждаются в блокировке или ограниченности, могут использовать новый tbb::concurrent_queue, а варианты использования, которые действительно нуждаются в нем, могут использовать tbb::concurrent_bounded_queue.


(a) Арка является архитектором Threading Building Blocks.

4 голосов
/ 13 октября 2010

Если вам нужен блокирующий щелчок без занятого ожидания, вам нужен метод сигнализации. Это подразумевает синхронизацию между пушером и попером, и очередь больше не обходится без (дорогих) примитивов синхронизации. В основном вы получаете обычную синхронизированную очередь с условной переменной, используемой для уведомления попперсов о толчках, чего нет в духе коллекций concurrent_ *.

2 голосов
/ 16 октября 2010

Вопрос состоял в том, был ли другой вариант во время выполнения параллелизма, который обеспечивает функциональность блокировки очереди, потому что concurrent_queue нет, и есть в VS2010.

Комментарий Арча, конечно, является полностью правильным, блокирующие очереди и разблокирующие очереди являются отдельными вариантами использования, и поэтому они отличаются в VS2010 и TBB.

В VS2010 вы можете использовать шаблонный класс unbounded_buffer, в котором соответствующие методы называются enqueue и dequeue.

-Rick

0 голосов
/ 13 октября 2010

С точки зрения очереди не существует ситуации, когда нужно для блокировки вставки или удаления.Тот факт, что вам может понадобиться заблокировать и ждать вставки, не имеет значения.

Вы можете достичь желаемой функциональности, используя переменную условия, счетный семафор или что-то в этом роде (независимо от вашего конкретного API).обеспечивает).Ваша проблема не с блокировкой / неблокировкой;это звучит как классический производитель-потребитель.

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