Condivisione del buffer tra più thread parte 2

2

Questo è un seguito alla mia precedente domanda non risposta, quindi cerco di rendere più chiaro: ultima domanda .

Ho un buffer di dimensione n che viene riempito da una fonte esterna, ha 2 metodi principali get () e add (), get () blocks (via wait ()) se il buffer è vuoto e add () blocca se il buffer è pieno.

Questo riferimento all'oggetto buffer è disponibile per più utenti (thread).
Ogni consumatore legge i dati dal buffer indipendentemente dagli altri consumatori.

Tutti i consumatori devono leggere TUTTI i dati dal buffer.

Come suggerito da qualcuno, ho creato una hashmap dove key è un id del consumatore e value è l'indice all'interno del buffer letto da questo utente.

Il problema è che ogni consumatore continua a richiedere dati dal buffer. Ho bisogno in qualche modo di bloccarlo fino a quando il prossimo dataitem non sarà disponibile nel buffer.

Dove e come dovrei bloccarlo?
(Non posso usare wait () nell'oggetto consumer, perché il produttore non può chiamare notify () dal momento che produttore e consumatore sono oggetti diversi)

    
posta kenny 18.12.2011 - 13:07
fonte

3 risposte

1

Suona praticamente come Disruptor. Lì si dispone di un buffer circolare con diversi consumatori che ne leggono. Writer non può scrivere il prossimo elemento finché non viene letto da tutti i consumatori e il consumatore sa dove è lo scrittore, quindi non lo supererà.

Dai un'occhiata qui per una spiegazione migliore della mia :) Il codice sorgente è disponibile, ho sentito che c'è anche l'implementazione del pattern in C ++.

link
link

    
risposta data 28.12.2011 - 14:27
fonte
0

Le prestazioni sono cruciali? Sembra che potresti usare una coda per questo invece di implementarla tu stesso. Forse ActiveMQ potrebbe aiutare?

    
risposta data 18.12.2011 - 20:00
fonte
0

Non sono a conoscenza di alcuna struttura di dati pronti che consenta questo: il problema è che è necessario tenere traccia delle posizioni di lettura di ogni consumatore in modo che tutti ricevano la propria copia completa dei dati memorizzati nel buffer.

Ho il sospetto che tu stia meglio usando una coda per ogni lettore e che uno scrittore scriva su tutte queste code (in un modo che blocca se una delle code dei lettori è piena). Penso che questo ti darà lo stesso effetto generale.

Inoltre, tieni presente che quando un lettore si blocca e tutti gli altri lettori / scrittori si muovono velocemente, tutto si bloccherà: tutto si bloccherà sull'ultimo lettore poiché il buffer manterrà n elementi che sono ancora necessari per quel lettore.

    
risposta data 28.12.2011 - 15:23
fonte

Leggi altre domande sui tag