Boost.Thread和C ++ 11标准线程库之间有一些区别:
- Boost支持线程取消,C ++ 11线程不支持
- C ++ 11支持
std::async
,但Boost不支持
- Boost具有
boost::shared_mutex
用于多读者/单作家的锁定。类似的std::shared_timed_mutex
仅可自C ++ 14(N3891),而std::shared_mutex
仅可自C ++ 17(N4508)。
- C ++ 11超时与Boost超时不同(尽管现在应该很快改变Boost.Chrono了)。
- 一些名称是不同的(例如
boost::unique_future
vs std::future
)
- 的参数传递语义
std::thread
不同于boost::thread
--- Boost使用boost::bind
,后者需要可复制的参数。std::thread
允许将仅移动类型std::unique_ptr
作为参数传递。由于使用boost::bind
,占位符的语义(例如_1
嵌套绑定表达式中的语义)也可以不同。
- 如果您未明确调用
join()
,detach()
则boost::thread
析构函数和赋值运算符将调用detach()
要销毁/分配给的线程对象。对于C ++ 11 std::thread
对象,这将导致std::terminate()
对应用程序的调用并中止该应用程序。
为了阐明仅移动参数的要点,以下是有效的C ++ 11,并将所有权int
从临时std::unique_ptr
转移到f1
新线程启动时的参数。但是,如果您使用boost::thread
它,则它将无法使用,因为它在boost::bind
内部使用,并且std::unique_ptr
无法复制。GCC随附的C ++ 11线程库中还有一个错误阻止了此工作,因为该错误std::bind
也在该实现中使用。
void f1(std::unique_ptr<int>);
std::thread t1(f1,std::unique_ptr<int>(new int(42)));
如果您使用的是Boost,那么如果您的编译器支持的话,您可能可以相对轻松地切换到C ++ 11线程(例如,Linux上的最新版本的GCC具有可在-std=c++0x
模式下使用的C ++ 11线程库的最完整实现)。
如果您的编译器不支持C ++ 11线程,那么您可能能够获得第三方实现,例如Just :: Thread,但这仍然是一个依赖项。