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

StackOverflow https://stackoverflow.com/questions/1083924

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Может быть, это могло бы быть полезно: Взаимосвязанные функции скольжения.

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

@Daniele Teti:

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

Для очереди с несколькими производителями / с одним потребителем / FIFO вы можете легко создать один безблокировочный файл, используя SLIST или тривиальный безблокировочный стек LIFO.Что вы делаете, так это создаете второй "частный" стек для потребителя (который также может быть выполнен в виде SLIST для простоты или любой другой модели стека, которую вы выберете).Потребитель извлекает элементы из частного стека.Всякий раз, когда частный LIFO выдыхается, вы выполняете сброс, а не удаляете общий параллельный SLIST (захватывая всю цепочку SLIST), а затем просматриваете сброшенный список по порядку, помещая элементы в частный стек.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top