Std:: queue thread safe с производителем и несколькими потребителями
как я могу сделать поток в очереди безопасным? Мне нужно нажать /pop/front/back и очистить. есть ли что-то подобное в boost?
У меня есть один производитель и один или несколько пользователей.
Ответы
Ответ 1
Вы должны защитить доступ к std::queue
. Если вы используете boost, используйте boost::mutex
. Теперь, если у вас есть несколько считывателей и один поток записи, посмотрите boost::shared_lock
(для читателей) и boost::unique_lock
(для записи).
Однако, если вы столкнетесь с голосом писателя, посмотрите на boost::shared_mutex
.
Ответ 2
std::queue
не является потокобезопасным при написании одного или нескольких потоков. И его интерфейс не способствует реализации потоковой безопасности, поскольку он имеет отдельные методы, такие как pop()
, size()
и empty()
, которые должны быть синхронизированы извне.
Общим подходом * является реализация типа очереди с более простым интерфейсом и использование внутренних механизмов блокировки для обеспечения синхронизации.
* Поиск "параллельной очереди С++" должен дать много результатов. Я реализовал очень простую игрушку здесь, где ограничение заключалось в использовании только стандартного С++. См. Также книгу Энтони Уильямса С++ concurrency в действии, а также его блог.
Ответ 3
в boost 1.53 есть очередь lockfee http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html, нет мьютекса или smth, как это.
Ответ 4
Вы должны защитить его, например. с std::mutex
, при каждой операции. Boost будет альтернативой, если у вас еще нет С++ 11.