2011-12-20 28 views
12

Szukam kolejki priorytetowej zaimplementowanej w Delphi, która działałaby dobrze w środowisku wielowątkowym.Priorytetowa kolejka wątków bezpiecznych dla Delphi?

Idealnie pozbawiony blokady lub zaprojektowany do wielowątkowych wstawek/usuwa coś lepszego niż zamknięta owijka wokół implementacji jednowątkowej (którą już mam).

Specyfika polega na tym, że w normalnej pracy pojawiałyby się tylko dodania, usunięcia i powiadomienia, gdy zmieni się górny (priorytetowy element), podczas gdy operacje "pop" o najwyższym priorytecie powinny być bardzo rzadkie.

Byłby używany do zadań monitorowania wątku watchdoga/limitu czasu, wykonywanych w innych wątkach, oczekuje się, że zadanie to zakończy się normalnie przez większość czasu, więc zostaną one dodane/usunięte z kolejki. Wątek limitu czasu zasadniczo czeka na następne zdarzenie timeout, stąd potrzeba powiadomień, gdy nastąpi zmiana zdarzenia o najwyższym priorytecie.

Zadania są obsługiwane przez skrypty, które można bezpiecznie zakończyć w dowolnym momencie.

Jeśli istnieją lepsze algorytmy niż kolejka priorytetowa, mogą to być również dobre odpowiedzi!

Edit: po uwagą Martin James, inna specyfika jest taka, że ​​istnieje stosunkowo niewiele różne wartości limitu czasu, a dla każdej wartości limitu czasu, problem staje się, że z kolejki FIFO.

+0

Dlaczego "zablokowane opakowanie wokół implementacji jednowątkowej" nie jest wystarczająco dobre dla tego zadania? – Pol

+0

Jakie są ograniczenia wydajności, które powodują, że rozwiązanie blokujące nie jest odpowiednie? –

+0

@Pol: Nie jest wystarczająco dobra, ponieważ mam już jedną (jak powiedziałem w poście). –

Odpowiedz

0

Zamiast pojedynczej kolejki można użyć jednej kolejki dla każdego priorytetu.

OmnithreadLibrary zawiera wątku bezpieczne kolejki: http://code.google.com/p/omnithreadlibrary/

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

+4

Wiele kolejek o jednym priorytecie nie jest rozwiązaniem. Wszystkie operacje "popping" bardzo się komplikują. (Pychanie, OTOH, jest proste.) W moim planie średnioterminowym jest TODO, które mówi "sprawdź możliwość zablokowania kolejki priorytetowej", ale to się nie stanie w ciągu najbliższych kilku miesięcy. – gabr

1

Julian Bucknall (autor "tomy Delphi: Algorytmy i struktury danych") został niedawno ogłosił wydanie wersji Delphi XE z EZDSL (Biblioteka Delphi Structures) w jego Blog.

Niestety TThreadsafePriorityQueue (zaimplementowany w EZDSLPQu.PAS) jest oparty na blokadzie.

Nie mogę pomóc w dzieleniu się dobrymi wiadomościami, a moim drugim zamiarem jest wezwanie do jego wkładu w udzielenie odpowiedzi na pytanie.

+0

Używam EZDSL z własnym portem od zawsze, i jeśli ufam, że wszystko, na początek, jako baza, to EZDSL. –

Powiązane problemy