2011-12-20 6 views
12

Sto cercando una coda di priorità implementata in Delphi che funzioni bene in un ambiente multi-thread.Coda priorità thread-safe per Delphi?

Idealmente senza blocco o progettato per inserimenti/cancellazioni multi-thread con qualcosa di meglio di un wrapper bloccato attorno a un'implementazione a thread singolo (che ho già).

La particolarità è che nel normale funzionamento, ci sarebbero solo aggiunte, eliminazioni e notifiche quando il primo (elemento con la priorità più alta) cambia, mentre le operazioni "pop" dell'elemento con la priorità più alta dovrebbero essere molto infrequenti.

Sarebbe utilizzato per attività di controllo del thread di watchdog/timeout, essendo eseguito in altri thread, si prevede che tali attività terminino normalmente la maggior parte del tempo, quindi verranno semplicemente aggiunte/rimosse dalla coda. Il thread di timeout sarebbe essenzialmente in attesa del prossimo evento di timeout, quindi la necessità di notifiche quando l'evento con priorità più alta cambia.

Le attività sono gestite da script, che possono essere terminati in modo sicuro in qualsiasi momento.

Se ci sono algoritmi migliori per questo rispetto a una coda di priorità, potrebbero essere anche buone risposte!

Edit: a seguito di un'osservazione da Martin James, un'altra specificità è che ci sono relativamente pochi valori di timeout diversi, e per ogni valore di timeout, il problema diventa quello di una coda FIFO.

+0

Perché "wrapper bloccato su un'implementazione a thread singolo" non è sufficiente per questa attività? – Pol

+0

Quali sono i limiti di prestazioni che rendono non appropriata una soluzione basata su lock? –

+0

@Pol: Non è abbastanza buono perché ne ho già uno (come detto nel post) –

risposta

0

Invece di una singola coda è possibile utilizzare una coda per ogni priorità.

L'OmnithreadLibrary contiene filo code sicure: http://code.google.com/p/omnithreadlibrary/

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

+4

Più code a priorità singola non sono realmente una soluzione. Tutte le operazioni "popping" si complicano immensamente. (Spingere, OTOH, è semplice.) Nel mio piano a medio termine c'è un TODO che dice "verifica la possibilità di una coda di priorità senza blocco", ma ciò non accadrà nei prossimi mesi. – gabr

1

Julian Bucknall (Autore di "Tomes di Delfi: Algoritmi e Strutture Dati") ha recentemente annunciato il rilascio di una versione di Delphi XE di EZDSL (una libreria Delphi Structures) nel suo Blog.

Sfortunatamente TThreadsafePriorityQueue (implementato in EZDSLPQu.PAS) è basato su blocco.

Non posso contribuire a condividere la buona notizia e il mio altro intento è una chiamata per il suo contributo nel rispondere alla domanda.

+0

Uso da sempre il mio EZDSL personalizzato, e se mi fido di qualsiasi cosa per iniziare come base, è EZDSL. –

1

L'architettura del mio framework è completamente costruita attorno alle code con thread prioritari: questo è l'unico modello di thread che utilizzo (http://www.csinnovations.com/framework_overview.htm). Una curva di apprendimento ripida, ma potrebbe darti qualche idea.