C++11 std:: threads vs posix threads

Dlaczego mam preferować takie czy inne w praktyce? Czym są różnice techniczne poza tym, że std::thread jest klasą?

Author: Ajay, 2012-10-30

4 answers

Jeśli chcesz uruchamiać kod na wielu platformach, wybierz wątki Posix. Są one dostępne prawie wszędzie i są dość dojrzałe. Z drugiej strony, jeśli używasz tylko Linuksa / gcc std::thread jest w porządku-ma wyższy poziom abstrakcji, naprawdę dobry interfejs i ładnie gra 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ę dostępny. Na przykład w natywnym Androidzie std::thread lub Win64 po prostu nie działa lub ma poważne ograniczenia wydajności (stan na 2012 r.).

Dobrym zamiennikiem jest boost::thread - jest bardzo podobny do std::thread (w rzeczywistości jest od tego samego autora) i działa niezawodnie, ale oczywiście wprowadza kolejną zależność od biblioteki stron trzecich.


Edit: od 2017 roku, std::thread działa głównie na natywnym Androidzie. Niektóre klasy, jak std::timed_mutex nadal nie są zaimplementowane.

 126
Author: Gunther Piez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-12 12:05:49

Biblioteka std::thread jest zaimplementowana na pthreads w środowisku obsługującym pthreads (na przykład: libstdc++).

Myślę, że dużą różnicą między nimi jest abstrakcja. std::thread jest biblioteką klas C++. Biblioteka std::thread zawiera wiele abstrakcyjnych funkcji, na przykład: blokady scoped, rekurencyjne muteksy, implementacje future / promise design pattern i wiele innych.
 63
Author: Akira Takahashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-30 11:18:38

std::thread zapewnia przenośność na różnych platformach, takich jak Windows, MacOS i Linux.

Jak wspomniano przez @ hirshhornsalz w komentarzach poniżej i pokrewnej odpowiedzi https://stackoverflow.com/a/13135425/1158895, std::thread może nie być jeszcze kompletna na wszystkich platformach. Mimo to, (będzie to w najbliższej przyszłości) powinno być faworyzowane przez pthread'S, ponieważ powinno to uczynić Twoją aplikację bardziej przyszłościową.

 36
Author: Brady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:04

Dla mnie decydującą różnicą techniczną jest brak prymitywów obsługi sygnału w std w przeciwieństwie do pthreads. Niemożność prawidłowego dyktowania obsługi sygnału w procesie uniksowym przy użyciu samego std jest AFAIK wyniszczającą wadą w użyciu std:: thread, ponieważ bary jeden z konfigurowania w dobrej wierze wielowątkowy wzór obsługi sygnału przetwarzać wszystkie sygnały w dedykowanym wątku i zablokować je w pozostałej części. Jesteś zmuszony założyć, że wątek std::jest zaimplementowany przy użyciu pthreads I hope dla najlepszego wykorzystania pthread_sigmask. Prawidłowe obchodzenie się z sygnałami nie podlega negocjacjom w systemach Unixowych.

W 2016 roku, STD::thread jest zabawką; proste.

 8
Author: Waslap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-20 05:09:59