2010-10-13 16 views
15

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?

Odpowiedz

25

Od a comment from Arch Robison i nie ma się o wiele bardziej niż "horse's mouth" (a):


PPL concurrent_queue ma blokowania pop, stąd nie ma tbb::strict_ppl::concurrent_queue. Blokujący pop jest dostępny w tbb::concurrent_bounded_queue.

Argumentem projektu dla pominięcia popu blokującego jest to, że w wielu przypadkach synchronizacja blokowania jest realizowana poza kolejką, w którym to przypadku implementacja blokowania wewnątrz kolejki staje się niepotrzebna narzut.

Z drugiej strony, pop blokowy starego tbb::concurrent_queue był popularny wśród użytkowników, którzy nie mieli zewnętrznej synchronizacji.

Podzielamy więc funkcjonalność. Przypadki, które nie wymagają blokowania lub ograniczania, mogą korzystać z nowego tbb::concurrent_queue, a przypadki, które tego wymagają, mogą korzystać z tbb::concurrent_bounded_queue.


(a) Arch jest kowalem Threading Building Blocks.

4

Jeśli potrzebujesz popu blokującego bez zapracowanego oczekiwania, potrzebujesz metody sygnalizacji. Oznacza to synchronizację pomiędzy popychaczem i poperem, a kolejka nie jest już pozbawiona (kosztownych) operacji podstawowych synchronizacji. Można w zasadzie uzyskać normalną kolejkę zsynchronizowany ze zmienną warunek wykorzystywane do powiadamiania pukawki z pchnięć, które nie jest w spirity z concurrent_ * kolekcji.

0

Nie ma sytuacji, z punktu widzenia kolejki, że powinna potrzebujesz, aby zablokować wstawianie lub usuwanie. Fakt, że być może trzeba zablokować i poczekać na wstawienie jest nieistotny.

można osiągnąć funkcjonalność pragnienie przy użyciu zmiennej stanu lub semafora liczenia, lub coś wzdłuż tych linii (bez względu na specyficzny API udostępnia). Twoje problemy nie polegają na blokowaniu/blokowaniu; brzmi jak klasyczny producent-konsument.

+2

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

2

Pytanie było, czy nie było innej opcji w Współbieżnym Runtime, która zapewnia funkcjonalność blokowania kolejki ponieważ concurrent_queue nie robi i nie ma jeden w VS2010.

komentarz Arch jest oczywiście całkowicie poprawna, blokowanie i odblokowywanie kolejki kolejki są osobne przypadki użycia i dlatego są one różne w VS2010 i TBB.

W VS2010 można użyć klasy szablonowej uncontrol_buforu znajdującej się w, odpowiednie metody nazywane są kolejkowaniem i usuwaniem.

-Rick

Powiązane problemy