2011-12-20 4 views
12

Я ищу приоритетную очередь, реализованную в Delphi, которая будет хорошо работать в многопоточной среде.Резервная очередь приоритетов для Delphi?

Идеально незакреплен или предназначен для многопоточных вставок/удалений с чем-то лучше, чем заблокированная обертка вокруг однопоточной реализации (что у меня уже есть).

Специфика заключается в том, что при нормальной работе будут добавлены, удалены и уведомления, когда изменяется верхний (элемент с наивысшим приоритетом), в то время как операции «поп» элемента с наивысшим приоритетом должны быть очень редкими.

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

Задачи обрабатываются с помощью сценариев, которые можно безопасно прекратить в любое время.

Если для этого есть лучшие алгоритмы, чем приоритетная очередь, они также могут быть хорошими ответами!

Редактировать: Следуя замечанию Мартина Джеймса, еще одна особенность заключается в том, что существует относительно мало разных значений тайм-аута, а для каждого значения тайм-аута проблема становится проблемой в очереди FIFO.

+0

Почему «заблокированная обертка вокруг однопоточной реализации» недостаточно хороша для этой задачи? – Pol

+0

Каковы ограничения производительности, которые делают решение на основе блокировки не соответствующим? –

+0

@Pol: Это не очень хорошо, потому что у меня уже есть один (как сказано в сообщении) –

ответ

0

Вместо одной очереди вы можете использовать одну очередь для каждого приоритета.

OmniThreadLibrary содержит Потокобезопасную очереди: http://code.google.com/p/omnithreadlibrary/

http://code.google.com/p/omnithreadlibrary/

+4

Несколько очередей с одним приоритетом на самом деле не являются решением. Все операции «popping» усложняются. (Pushing, OTOH, прост.) В моем среднесрочном плане речь идет о TODO, в котором говорится: «Проверьте возможность приоритетной очереди без блокировки», но этого не произойдет в ближайшие несколько месяцев. – gabr

1

Julian Bucknall (автор "Тоумс Дельфы: Алгоритмы и структуры данных") недавно объявил о выпуске версии Delphi XE от EZDSL (библиотека структур Delphi) в его Blog.

К сожалению, TThreadsafePriorityQueue (реализованный в EZDSLPQu.PAS) основан на блокировке.

Я не могу поделиться хорошими новостями, и мои другие намерения - это призыв к его вкладу в ответ на вопрос.

+0

Я использую свой собственный персональный EZDSL с навсегда, и если я доверяю чему-либо, чтобы начать с базы, это EZDSL. –

1

Моя архитектура каркаса полностью построена вокруг приоритетных поточных очередей - это единственная модель нитей, которую я использую (http://www.csinnovations.com/framework_overview.htm). Крутая кривая обучения, но это может дать вам некоторые идеи.

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