Why should I prefer one or another in practice?
What are the technical differences except that std::thread
is a class?
If you want to run code on many platforms, go for Posix Threads. They are available almost everywhere and are quite mature. On the other hand if you only use Linux/gcc std::thread
is perfectly fine - it has a higher abstraction level, a really good interface and plays nicely with other C++11 classes.
The C++11 std::thread
class unfortunately doesn't work reliably (yet) on every platform, even if C++11 seems available. For instance in native Android std::thread
or Win64 it just does not work or has severe performance bottlenecks (as of 2012).
A good replacement is boost::thread
- it is very similar to std::thread
(actually it is from the same author) and works reliably, but, of course, it introduces another dependency from a third party library.
Edit: As of 2017, std::thread
mostly works on native Android. Some classes, like std::timed_mutex
are still not implemented.
std::thread
and its raii-style is good because it can handle C++ exceptions while pthreads cannot out of the box. –
Confab std::thread
itself seems to run ok, related classes like std::condition_variable
and std::mutex
use up a lot more of time. The contention is low - in linux almost not measurable. I used gcc-4.7.*
–
Rules std::thread
just does not work at all . But hopefully this may change soon. –
Rules std::thread
is to be preferred - it has a much better abstration and plays very nicely with other thread related classes in C++11, like mutexes or even std::chrono
. That and the "portability" was the reason I used it in the first place, only to get bitten quite a few times when it comes to actual porting. –
Rules std::thread
? Compared to MSVC I would expect a performance hit because they use a port of pthreads, but MSVC should be okay. –
Confab std::thread
now and forever. It's cross platform and as another answerer said it's future proof and does not suffer from performance bottlenecks. –
Afterward std::thread
fares today. Afaik it does really really well (eg, works perfectly for me with Win64) and I'd personally recommend std::thread
in general first these days, but unfortunately nowhere near an expert on compatibility –
Ostyak std::thread
works on Windows just fine since 2015. On the contrary, POSIX threads in VC++ do not exist. –
Immersed The std::thread
library is implemented on top of pthreads in an environment supporting pthreads (for example: libstdc++).
I think the big difference between the two is abstraction. std::thread
is a C++ class library. The std::thread
library includes many abstract features, for example: scoped locks, recursive mutexes, future/promise design pattern implementations, and more.
std::thread
provides portability across different platforms like Windows, MacOS, and Linux.
As mentioned by @hirshhornsalz in the comments below and related answer https://mcmap.net/q/134648/-c-11-std-thread-vs-posix-threads, std::thread
may not be complete on all platforms yet. Even still, (it will be in the near future) it should be favored over pthread
's because it should make your application more future-proof.
boost::thread
on Win64 or Bionic (Android), because std::thread
is still lacking big parts, where on Linux std::thread
seems quite mature. –
Rules For me the deciding technical difference is the absence of signal handling primitives in std as opposed to pthreads. The inability to properly dictate signal handling in a Unix process using std alone is AFAIK a debilitating flaw in the use of std::thread as it bars one from setting up the bona fide multi-threaded signal handling pattern to process all signals in a dedicated thread and block them in the rest. You are forced to assume std::thread is implemented using pthreads and hope for the best when using pthread_sigmask. Handling signals properly is non-negotiable in Unix systems programming for the enterprise.
As at 2016, std::thread is a toy; simple as that.
std::thread
brings type safety that pthread doesn't have. –
Fara I just found that std::thread
imposes a limit on the number of threads that POSIX threads doesn't have. It seems that the thread creation in C++ checks a systemd
property named DefaultTasksMax
, that is not checked by Posix libpthread
.
I will soon update this answer with snippets in C++ and C that seem to prove this point.
© 2022 - 2024 — McMap. All rights reserved.
std::async
– Frizzellstd::thread
does – Rulesstd::thread
orpthreads
don't. – Frizzell