Существует ли в Delphi очередь без очереди "несколько производителей-один потребитель"?

Я нашел несколько реализаций для одного производителя-единственного потребителя, но не для нескольких производителей-одиночных потребителей.

Для Delphi существует ли свободная очередь для "нескольких производителей-одного потребителя"?

Ответ 1

Свободная от очереди очередь из OmniThreadLibrary поддерживает несколько производителей. Вы можете использовать его отдельно от библиотеки потоков (т.е. Вы можете использовать модуль OtlContainers в любой другой среде).

Как указал Даниэле ниже, в OmniThreadLibrary есть две очереди. Один в OtlContainers поддерживает несколько производителей и нескольких потребителей, а "умная" версия в OtlComm (которая является просто оболочкой для более простой версии) - это только один производитель/единственный потребитель.

Документация по-прежнему является большой проблемой для проекта OmniThreadLibrary:( Некоторую информацию о очереди можно найти здесь.

Ответ 3

http://svn.berlios.de/svnroot/repos/dzchart/utilities/dzLib/trunk/lockfree/

@Daniele Teti:

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

Ответ 4

Для многопользовательской/однопользовательской очереди /FIFO вы можете легко сделать один LockFree с помощью SLIST или тривиального стека LIFO Lock Free. У вас есть второй "private" стек для пользователя (который также можно сделать как SLIST для простоты или любой другой выбранной вами модели стека). Пользователь выталкивает предметы из частного стека. Всякий раз, когда частный LIFO exhasted, вы делаете Flush, а не Pop из общего совместного SLIST (захватывая всю цепочку SLIST), а затем пройдите по Flushed-списку, нажимая элементы в отдельный стек.

Это работает для одного производителя/одного потребителя и для нескольких производителей/для одного потребителя.

Однако он не работает для случаев с несколькими производителями/с несколькими потребителями.