2013-08-27 3 views
1

Я довольно много искал для бесплатной очереди в C/C++. Но большинство из них должны указывать максимальное количество элементов, включая boost :: lockfree.очередь без блокировки?

Может ли кто-нибудь дать мне некоторую информацию об переменной длине и множестве продуктов и нескольких потребительских беспошлинной очереди?

+0

Традиционное решение описано Майклом-Скоттом и улучшено Орларей-Фобер-Лэц. –

+0

Это было задано раньше, и некоторые из ответов здесь пока остаются действительными и поддерживаются: [Есть ли готовая версия без блокировки или хеш-реализация на C++] (http://stackoverflow.com/questions/1164023/is -there-a-production-ready-lock-free-queue-or-hash-implementation-in-c) –

ответ

2

Основная причина максимальной длины заключается в том, что после создания очереди вы не можете создавать новые объекты (без потенциальной блокировки в new или malloc или что-то другое, что используется для создания нового объекта).

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

boost::lockfree имеет reserve(n) и reserve_unsafe(n), которые могут использоваться для выращивания очереди.

Редактировать в ответ на комментарий:

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

Если это происходит только через относительно редкие промежутки времени, это может быть не очень дорого (в зависимости от случая использования). Но если это случается регулярно, это будет проблемой.

Даже с одним производителем нет гарантии, что какой-либо другой поток не вызывает malloc или new где-то, вызывая «ожидание» в «добавить больше в очередь».

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

+0

Фактически я обнаружил, что lockfree с динамическим размером, но это однопроцессорный, один потребитель. [link] (http://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++). Я полагаю, что очередь создаст новый узел и изменит размер, когда количество элементов выходит за пределы высокого уровня. – user2720721

+0

Я снова смотрю на документ подкрепления. он говорит: «Выделение памяти из операционной системы не является блокировкой, что делает невозможным реализацию реальных динамически неструктурированных структур данных». очередь с динамическим размером может изменяться сама по себе, поскольку она является единственным продуктом? – user2720721

+0

@ user2720721: См. Редактирование в ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^