Motivation: reason why I'm considering it is that my genius project manager thinks that boost is another dependency and that it is horrible because "you depend on it"(I tried explaining the quality of boost, then gave up after some time :( ). Smaller reason why I would like to do it is that I would like to learn c++11 features, because people will start writing code in it. So:
- Is there a 1:1 mapping between
#include<thread> #include<mutex>
and boost equivalents? - Would you consider a good idea to replace boost stuff with c++11
stuff. My usage is primitive, but are there examples when std doesnt offer what boost does? Or (blasphemy) vice versa?
P.S. I use GCC so headers are there.
std::thread
is largely modelled afterboost::thread
, with a few differences:This is from 2007, so some points are no longer valid:
boost::thread
has anative_handle
function now, and, as commenters point out,std::thread
doesn't have cancellation anymore.I could not find any significant differences between
boost::mutex
andstd::mutex
.Enterprise Case
If you are writing software for the enterprise that needs to run on a moderate to large variety of operating systems and consequently build with a variety of compilers and compiler versions (especially relatively old ones) on those operating systems, my suggestion is to stay away from C++11 altogether for now. That means that you cannot use
std::thread
, and I would recommend usingboost::thread
.Basic / Tech Startup Case
If you are writing for one or two operating systems, you know for sure that you will only ever need to build with a modern compiler that mostly supports C++11 (e.g. VS2015, GCC 5.3, Xcode 7), and you are not already dependent on the boost library, then
std::thread
could be a good option.My Experience
I am personally partial to hardened, heavily used, highly compatible, highly consistent libraries such as boost versus a very modern alternative. This is especially true for complicated programming subjects such as threading. Also, I have long experienced great success with
boost::thread
(and boost in general) across a vast array of environments, compilers, threading models, etc. When its my choice, I choose boost.There is one reason not to migrate to
std::thread
.If you are using static linking,
std::thread
becomes unusable due to these gcc bugs/features:Namely, if you call
std::thread::detach
orstd::thread::join
it will lead to either exception or crash, whileboost::thread
works ok in these cases.With Visual Studio 2013 the
std::mutex
seems to behave differently than theboost::mutex
, which caused me some problems (see this question).I tried to use shared_ptr from std instead of boost and I actually found a bug in gcc implementation of this class. My application was crashing because of destructor called twice (this class should be thread-safe and shouldn't generate such problems). After moving to boost::shared_ptr all problems disappeared. Current implementations of C++11 are still not mature.
Boost has also more features. For example header in std version doesn't provide serializer to a stream (i.e. cout << duration). Boost has many libraries that use its own , etc. equivalents, but do not cooperate with std versions.
To sum up - if you already have an application written using boost, it is safer to keep your code as it is instead of putting some effort in moving to C++11 standard.
There are several differences between Boost.Thread and the C++11 standard thread library:
std::async
, but Boost does notboost::shared_mutex
for multiple-reader/single-writer locking. The analogousstd::shared_timed_mutex
is available only since C++14 (N3891), whilestd::shared_mutex
is available only since C++17 (N4508).boost::unique_future
vsstd::future
)std::thread
are different toboost::thread
--- Boost usesboost::bind
, which requires copyable arguments.std::thread
allows move-only types such asstd::unique_ptr
to be passed as arguments. Due to the use ofboost::bind
, the semantics of placeholders such as_1
in nested bind expressions can be different too.join()
ordetach()
then theboost::thread
destructor and assignment operator will calldetach()
on the thread object being destroyed/assigned to. With a C++11std::thread
object, this will result in a call tostd::terminate()
and abort the application.To clarify the point about move-only parameters, the following is valid C++11, and transfers the ownership of the
int
from the temporarystd::unique_ptr
to the parameter off1
when the new thread is started. However, if you useboost::thread
then it won't work, as it usesboost::bind
internally, andstd::unique_ptr
cannot be copied. There is also a bug in the C++11 thread library provided with GCC that prevents this working, as it usesstd::bind
in the implementation there too.If you are using Boost then you can probably switch to C++11 threads relatively painlessly if your compiler supports it (e.g. recent versions of GCC on linux have a mostly-complete implementation of the C++11 thread library available in
-std=c++0x
mode).If your compiler doesn't support C++11 threads then you may be able to get a third-party implementation such as Just::Thread, but this is still a dependency.