Dlaczego w praktyce powinienem preferować jednego lub drugiego? Jakie są różnice techniczne poza tym, że std::thread
jest to klasa?
std::thread
robi
std::thread
lub pthreads
nie.
Dlaczego w praktyce powinienem preferować jednego lub drugiego? Jakie są różnice techniczne poza tym, że std::thread
jest to klasa?
std::thread
robi
std::thread
lub pthreads
nie.
Odpowiedzi:
Jeśli chcesz uruchamiać kod na wielu platformach, przejdź do Posix Threads. Są dostępne prawie wszędzie i są dość dojrzałe. Z drugiej strony, jeśli używasz tylko Linuksa, / gcc std::thread
jest całkowicie w porządku - ma wyższy poziom abstrakcji, naprawdę dobry interfejs i dobrze współpracuje z innymi klasami C ++ 11.
Klasa C ++ 11 std::thread
niestety nie działa niezawodnie (jeszcze) na każdej platformie, nawet jeśli C ++ 11 wydaje się być dostępny. Na przykład w natywnym systemie Android std::thread
lub Win64 po prostu nie działa lub ma poważne wąskie gardła wydajności (stan na 2012 r.).
Dobrym zamiennikiem jest boost::thread
- jest bardzo podobny do std::thread
(właściwie pochodzi od tego samego autora) i działa niezawodnie, ale oczywiście wprowadza kolejną zależność z biblioteki innej firmy.
Edycja: od 2017 std::thread
działa głównie na natywnym Androidzie. Niektóre klasy, takie jak, std::timed_mutex
nadal nie są zaimplementowane.
std::thread
jego styl raii jest dobry, ponieważ obsługuje wyjątki C ++, podczas gdy pthreads nie mogą po wyjęciu z pudełka.
std::thread
Biblioteka realizowana jest na górze pthreads w środowisku wspierającym pthreads (na przykład: libstdc ++).
Myślę, że dużą różnicą między nimi jest abstrakcja. std::thread
jest biblioteką klas C ++. std::thread
Biblioteka zawiera wiele abstrakcyjnych cech, na przykład: zamki, lunetą rekurencyjnych muteksy, przyszłość / obietnica implementacje wzorca projektowania i więcej.
+1
ode mnie za wskazanie najważniejszej rzeczy, a mianowicie, że std :: thread zapewnia wyższy poziom abstrakcji.
std::thread
zapewnia przenośność na różnych platformach, takich jak Windows, MacOS i Linux.
Jak wspomniał @hirshhornsalz w komentarzach poniżej i powiązanej odpowiedzi https://stackoverflow.com/a/13135425/1158895 , std::thread
może nie być jeszcze kompletna na wszystkich platformach. Mimo to (nastąpi to w najbliższej przyszłości) powinno być preferowane pthread
, ponieważ powinno to uczynić twoją aplikację bardziej przyszłościową.
boost::thread
na Win64 lub Bionic (Android), ponieważ std::thread
wciąż brakuje dużych części, podczas gdy na Linuksie std::thread
wydaje się dość dojrzały.
Dla mnie decydującą różnicą techniczną jest brak prymitywów obsługi sygnału w std w przeciwieństwie do pthreads. Niezdolność do prawidłowego dyktowania obsługi sygnału w procesie uniksowym przy użyciu samego std jest AFAIK wyniszczającą wadą w używaniu std :: thread, ponieważ uniemożliwia ustawienie prawdziwego wielowątkowego wzorca obsługi sygnału do przetwarzania wszystkich sygnałów w dedykowanym wątku i zablokuj je w pozostałej części. Jesteś zmuszony założyć, że std :: thread jest zaimplementowany przy użyciu pthreads i mieć nadzieję na najlepsze, gdy używasz pthread_sigmask. Prawidłowa obsługa sygnałów nie podlega negocjacjom w programowaniu systemów Unix dla przedsiębiorstwa.
Od 2016 r. Std :: thread jest zabawką; proste.
std::thread
bezpieczeństwo typu, którego nie ma pthread.
OpenMP
jest znormalizowanym, wielowątkowym standardem opartym na protokole SMP, który działa w systemach Linux i Windows już od ponad dziesięciu lat. OpenMP jest domyślnie dostępny we wszystkich kompilatorach, w tym GCC i Microsoft Visual Studio.
Jedną rzeczą, na którą należy zwrócić uwagę podczas korzystania z OpenMP, jest to, że jeśli jest więcej wątków niż rdzeni procesora, wydajność spadnie z powodu obciążenia związanego z przełączaniem kontekstu. Drugą rzeczą, o której należy pamiętać, jest to, że inicjalizacja wątku na rzeczywistym poziomie systemu operacyjnego jest stosunkowo kosztowna. Inicjalizacja trwa ułamek sekundy, ale w niektórych zastosowaniach bardzo małe frakcje gromadzą się ze znacznym kosztem.
W przypadku współbieżności związanej z wymaganiami architektury oprogramowania możesz chcieć poszukać implementacji „lekkich wątków” lub „zielonych wątków” zamiast używania OpenMP. Różnica polega na tym, że wątki OpenMP są rzeczywistymi wątkami na poziomie systemu operacyjnego, ale „zielone wątki” mogą być po prostu „wątkami symulowanymi”, które są wykonywane przy użyciu niewielkiej liczby rzeczywistych wątków.
std::async