'Arresto' non viene spesso discusso perché spesso non viene mai eseguito. Nei casi in cui è richiesto, spesso è altrettanto semplice e flessibile accodare una pillola avvelenata utilizzando il protocollo P-C di livello superiore, così come lo è creare funzionalità extra nella coda stessa.
Se si vuole veramente fare questo, si può effettivamente impostare un flag che fa sì che ogni consumatore generi un'eccezione, "immediatamente" o ogni volta che ritorna in coda, ma ci sono problemi. Hai bisogno del metodo 'done' per essere sincrono, es. vuoi che tutti i consumatori se ne siano andati entro i ritorni "fatti" o asincroni, ad es. l'ultimo thread del consumatore chiama un parametro evento quando tutti gli altri utenti se ne sono andati?
Come stai andando a organizzare per quei consumatori che sono attualmente in attesa di svegliarsi? Quanti ne stanno aspettando e quanti ne sono occupati, ma torneranno in coda quando avranno fatto il loro lavoro? Cosa succede se uno o più consumatori sono bloccati in una chiamata bloccante, (forse possono essere sbloccati, ma ciò richiede una chiamata da un altro thread - come hai intenzione di farlo)?
Come faranno sapere i consumatori che hanno gestito la loro eccezione e stanno per morire? Sta per morire abbastanza, o è necessario attendere il thread handle? Se è necessario attendere l'handle del thread, che cosa deve fare l'attesa: il thread che richiede l'arresto della coda o l'ultimo thread del consumatore da notificare?
Oh sì, per essere sicuri, è necessario organizzare i thread di produzione che vengono visualizzati con gli oggetti da accodare mentre si è in "chiusura" per generare un'eccezione.
Sollevo queste domande perché ho fatto tutto questo una volta, tanto tempo fa. Alla fine, tutto ha funzionato-ish. Gli oggetti in coda dovevano avere un 'QueuedItem' inserito nella loro catena di ereditarietà (in modo che un metodo di annullamento del lavoro potesse essere esposto alla coda) e la coda doveva tenere un elenco sicuro di oggetti che era stato saltato da thread, ma non ancora elaborato.
Dopo un po ', ho smesso di usare la classe in favore di una semplice coda P-C senza alcun meccanismo speciale di spegnimento.
Spesso devi usare un valore speciale del tipo 'T', chiamare' QuitMessage' o qualcosa del genere. Ma presumibilmente vuoi costruire questo in coda, indipendentemente dal tipo, piuttosto che lasciare il produttore e il consumatore a definire un protocollo ad un livello più alto? –
@SteveJessop: Sì. Voglio renderlo generico. L'idea del valore speciale non sembra essere buona. Il valore molto speciale potrebbe essere un valore valido per alcuni 'T', o il mio sentimento dice che non è così buono. – Nawaz
Sto proponendo che il produttore selezioni e documenti il valore speciale. Se usano un valore che ha anche un altro significato, allora sono probabilmente stupidi o qualcosa del genere. –