Основная причина максимальной длины заключается в том, что после создания очереди вы не можете создавать новые объекты (без потенциальной блокировки в new
или malloc
или что-то другое, что используется для создания нового объекта).
Я не уверен, что есть решение. Если блокировки распределения допустимы, было бы нелегко сделать незаблокированную очередь, ограниченную количеством доступной памяти.
boost::lockfree
имеет reserve(n)
и reserve_unsafe(n)
, которые могут использоваться для выращивания очереди.
Редактировать в ответ на комментарий:
Да, настоящие проблемы начинаются, когда две производители пытаются добавить новые элементы в то же самое время, потому что на каком-то уровне или иначе, выделение памяти не будет блокировать до тех пор " ведущий "поток завершил выделение. Разумеется, это может быть приемлемым в некоторых случаях, но, как правило, причиной использования незакрепленных очередей является исключение блокировок, а блокировка внутри new
или malloc
еще не является блокировкой.
Если это происходит только через относительно редкие промежутки времени, это может быть не очень дорого (в зависимости от случая использования). Но если это случается регулярно, это будет проблемой.
Даже с одним производителем нет гарантии, что какой-либо другой поток не вызывает malloc
или new
где-то, вызывая «ожидание» в «добавить больше в очередь».
Я думаю, что единственным реальным решением является создание очереди с фиксированным размером с достаточно большим размером для работы с любой возможной рабочей нагрузкой. Если сама очередь содержит (умные) указатели/ссылки на объекты, это может не занимать слишком много памяти выше и выше объектов, которые фактически хранятся в очереди. В конце концов, если вы храните 1000 элементов, вам нужно хранить не менее 1000 элементов, независимо от того, является ли очередь динамической или фиксированной.
Традиционное решение описано Майклом-Скоттом и улучшено Орларей-Фобер-Лэц. –
Это было задано раньше, и некоторые из ответов здесь пока остаются действительными и поддерживаются: [Есть ли готовая версия без блокировки или хеш-реализация на C++] (http://stackoverflow.com/questions/1164023/is -there-a-production-ready-lock-free-queue-or-hash-implementation-in-c) –