W środowisku wykonawczym współbieżności wprowadzonym w VS2010 istnieje klasa concurrent_queue. Ma niezablokowującą funkcję try_pop().
Podobne w blokach wątków Intela (TBB), blokujące wywołanie pop() zostało usunięte podczas przechodzenia z wersji 2.1 na 2.2.Dlaczego concurrent_queue nie blokuje?
Zastanawiam się, jaki jest problem z blokowaniem połączenia. Dlaczego został usunięty z TBB? I dlaczego nie ma blokowania concurrent_queue?
Jestem w sytuacji, w której potrzebuję blokującej równoległej kolejki i nie chcę zbyt długiego oczekiwania. Oprócz pisania samej kolejki, czy istnieje inna możliwość w środowisku wykonawczym współbieżności?
Z blokującej 'pop' można wdrożyć * *„Classic producent-konsument”TBB w użyciu około dwóch linii kodu, bez konieczności pisania jakichkolwiek prymitywów synchronizacji samemu. (Konsument robi 'while (true) consume (Q.pop());' a producent robi 'while (true) Q.push (produ());'.) Bez blokowania 'pop', ten sam problem wymaga co najmniej dwa razy tyle kodu: mianowicie księgowanie dodatkowej zmiennej warunkowej dla każdej kolejki. Ale jak mówi paxdiablo, 'tbb :: concurrent_bounded_queue' kontynuuje dostarczanie funkcji blokowania' pop' i jest w zasadzie zamiennikiem drop-in dla 'concurrent_queue'. – Quuxplusone