Dlaczego w praktyce powinienem preferować jednego lub drugiego? Jakie są różnice techniczne poza tym, że std::threadjest to klasa?
std::threadrobi
std::threadlub pthreadsnie.
Dlaczego w praktyce powinienem preferować jednego lub drugiego? Jakie są różnice techniczne poza tym, że std::threadjest to klasa?
std::threadrobi
std::threadlub pthreadsnie.
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::threadjest 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::threadniestety 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::threadlub 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::threaddziała głównie na natywnym Androidzie. Niektóre klasy, takie jak, std::timed_mutexnadal nie są zaimplementowane.
std::threadjego styl raii jest dobry, ponieważ obsługuje wyjątki C ++, podczas gdy pthreads nie mogą po wyjęciu z pudełka.
std::threadBiblioteka 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::threadjest biblioteką klas C ++. std::threadBiblioteka zawiera wiele abstrakcyjnych cech, na przykład: zamki, lunetą rekurencyjnych muteksy, przyszłość / obietnica implementacje wzorca projektowania i więcej.
+1ode 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::threadmoż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::threadna Win64 lub Bionic (Android), ponieważ std::threadwciąż brakuje dużych części, podczas gdy na Linuksie std::threadwydaje 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::threadbezpieczeń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