Myślałem o std::async
i jak należy go używać w przyszłej implementacji kompilatora. Jednak w tej chwili utknąłem w czymś, co wydaje mi się wadą projektu.std :: async - Użycie zależne od implementacji?
The std::async
jest zależny od implementacji, z prawdopodobnie dwoma wariantami launch::async
, jednym, który uruchamia zadanie w nowym wątku i takim, który używa puli wątków/harmonogramu zadań.
Jednak w zależności od jednego z tych wariantów, które są używane do implementacji std::async
, użycie będzie bardzo różne.
Dla wariantu opartego na "puli wątków" można uruchomić wiele małych zadań, nie martwiąc się zbytnio o koszty ogólne, ale co, jeśli jedno z zadań blokuje w pewnym momencie?
Z drugiej strony wariant "uruchom nowy wątek" nie miałby problemów z blokowaniem zadań, z drugiej strony obciążenie związane z uruchamianiem i wykonywaniem zadań byłoby bardzo wysokie.
thread-pool: + nisko nad głową, -Nigdy kiedykolwiek blokowania
uruchamiają nowy wątek: + grzywny z bloków, -high napowietrznych
Więc zasadniczo w zależności od implementacji, sposób, w jaki używamy std::async
, byłby bardzo ostrożny. Jeśli mamy program, który działa dobrze z jednym kompilatorem, może działać strasznie na innym.
Czy jest to zgodne z projektem? Czy może czegoś brakuje? Czy uznałbyś to, tak jak ja, za duży problem?
W obecnej specyfikacji brakuje czegoś takiego, jak std::oversubscribe(bool)
, aby umożliwić wdrożenie zależnego od siebie użycia std::async
.
EDYCJA: O ile przeczytałem, standardowy dokument C++ 11 nie daje żadnych wskazówek dotyczących tego, czy zadania wysłane do std::async
mogą blokować, czy nie.
Tak samo jako dodatek: http://en.cppreference.com/w/cpp/thread/async dostarcza całkiem prostego i realistycznego przykładu blokowania wywołań 'std :: async'. – KillianDS
Wydaje się, że zakładasz, że pule wątków mają stały rozmiar. W praktyce wiele z nich ma rozmiar dynamiczny, więc blokowanie nie jest problemem. –
@MooingDuck: Ani TBB ani Concrt nie mają "dynamicznie" wielkości pul wątków. Jakie pule wątków wiesz o tym są dynamiczne? I nawet jeśli masz pulę wątków o dynamicznym rozmiarze, zamiast tego pojawia się problem nadsubskrypcji i nakłady heurystyczne są potrzebne, aby śledzić, kiedy dodawać nowe wątki i usuwać stare. – ronag