Nel runtime di concorrenza introdotto in VS2010, esiste una classe concurrent_queue. Ha una funzione try_pop() non bloccante.
Simile in Intel Thread Building Blocks (TBB), la chiamata di blocco pop() è stata rimossa passando dalla versione 2.1 alla 2.2.perché concurrent_queue non è bloccante?
Mi chiedo quale sia il problema con una chiamata di blocco. Perché è stato rimosso da TBB? E perché non esiste un blocco concurrent_queue?
Sono in una situazione in cui ho bisogno di una coda concomitante di blocco e non voglio un'attesa occupata. Oltre alla scrittura di una coda, c'è un'altra possibilità nel runtime di concorrenza?
Con un blocco 'pop', è possibile implementare * * "classico produttore-consumatore" utilizzando TBB in circa due righe di codice, senza la necessità di scrivere alcun primitive di sincronizzazione da soli. (Il consumatore usa 'while (true) consuma (Q.pop());' e il produttore fa 'while (true) Q.push (produce());'.) Senza un 'pop' di blocco, lo stesso problema richiede almeno il doppio del codice: vale a dire, contabilità una variabile di condizione extra per coda. Ma come dice paxdiablo, 'tbb :: concurrent_bounded_queue' continua a fornire la funzionalità di blocco' pop', ed è fondamentalmente una sostituzione drop-in per 'concurrent_queue'. – Quuxplusone