2013-07-29 2 views
2

, когда я объявляю свою очередь, какподталкивание поведение очереди lockfree в случае fixed_sized <true>

typedef boost::lockfree::queue<MyMessage, boost::lockfree::fixed_sized<true>> MessageQueue 

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

, но когда я не использую свойство фиксированного размера, то есть не указываю параметр шаблона fixed_sized<true>, очередь работает нормально. Но в этом случае очередь фактически выполняет выделение/освобождение памяти, которая побеждает цель использования незанятой очереди.

Так что мой вопрос: "is boost :: lockfree :: queue становится одиночной-одиночной очередью, если установлено с свойством fixed_sized<true>?"

Есть ли какие-то разные методы push/pop, которые мне нужно использовать?

Я хочу очередь MPMC, которая не выполняет выделение выделения памяти. если boost не предоставляет этого, есть ли какая-либо другая очередь, которую я могу использовать?

Спасибо заранее,

+0

код [документация] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/ lockfree/queue.html) говорит: «Класс очереди предоставляет очередь с несколькими писателями/несколькими читателями», ничто в документации не указывает на то, что это изменится с помощью политики «fixed_size».Кроме того, очередь без блокировки "использует freelist для управления памятью, освобожденные узлы переносятся в freelist и не возвращаются в ОС до того, как очередь будет уничтожена" (по умолчанию), поэтому выделение памяти не происходит для каждого 'push' даже без 'fixed_size'. Предоставьте [SSCCE] (http://sscce.org). – dyp

+0

приведенный выше вопрос описывает мои наблюдения. как только я использую политику 'fixed_size', очередь застревает, если несколько потоков называют' push() '. Он не застревает, если я гарантирую, что только один поток вызывает 'push()'. Как это объяснить? – weima

+1

'push' документирован как« потокобезопасный », было бы неплохо, если бы вы могли разместить небольшой пример кода, который реплицирует проблему. Возможно, это даже ошибка в версии, которую вы используете. Насколько я вижу, в документации говорится, что это mutli-write/multi-reader, независимо от политик. – dyp

ответ

4

Так что мой вопрос делает повышение :: lockfree :: очереди становится в очередь одного производителя однозначных потребителя, если установлен со свойством fixed_size?

Ответ: Согласно docs, нет. Функции-члены имеют различную безопасность потоков, но вы можете использовать очередь блокировки в качестве очереди MRMW независимо от того, является ли политика fixed_size<true> или fixed_size<false> (например, функции-члены push и pop являются потокобезопасными).

См. Комментарии к ОП для обсуждения. Короткая версия:

Если интерпретировать документы правильно, fixed_size<true> политика предполагает следующие изменения:

  • Если вы звоните push и дальнейшие возможности не доступны, push терпит неудачу и возвращает false.

  • Максимальная емкость, которую можно установить, обычно ограничена 2 -2 элементов.

  • Поскольку емкость не изменяется автоматически, вам необходимо вручную установить емкость через ctor queue(size_type) или функцию-член reserve. По умолчанию ctor установит емкость 0. (Это означает, что для мощности по умолчанию 0, каждый push потерпит неудачу.)

+0

, как указано в комментариях к вопросам, ошибка была в коде пользователя. – weima