, когда я объявляю свою очередь, какподталкивание поведение очереди 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 не предоставляет этого, есть ли какая-либо другая очередь, которую я могу использовать?
Спасибо заранее,
код [документация] (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
приведенный выше вопрос описывает мои наблюдения. как только я использую политику 'fixed_size', очередь застревает, если несколько потоков называют' push() '. Он не застревает, если я гарантирую, что только один поток вызывает 'push()'. Как это объяснить? – weima
'push' документирован как« потокобезопасный », было бы неплохо, если бы вы могли разместить небольшой пример кода, который реплицирует проблему. Возможно, это даже ошибка в версии, которую вы используете. Насколько я вижу, в документации говорится, что это mutli-write/multi-reader, независимо от политик. – dyp