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_futurevs 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,但这仍然是一个依赖项。