c++ - 用c ++ 11等价物替换boost :: thread和boost :: mutex是否明智?




3 Answers

Boost.Thread和C ++ 11标准线程库之间有几个区别:

  • Boost支持线程取消,C ++ 11线程不支持
  • C ++ 11支持std::async ,但Boost不支持
  • Boost有一个boost::shared_mutex用于多读卡器/单写入器锁定。 类似的std::shared_timed_mutex仅在C ++ 14( N3891 )之后N3891 ,而std::shared_mutex仅在C ++ 17( N4508 )之后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有一个大体完整的C ++ 11线程库实现,可用于-std=c++0x模式)。

如果您的编译器不支持C ++ 11线程,那么您可能能够获得第三方实现,如Just :: Thread ,但这仍然是依赖关系。

动机:我考虑的原因是,我的天才项目经理认为助推是另一个依赖,它是可怕的,因为“你依赖它”(我尝试解释助推的质量,然后在一段时间后放弃:( )。为什么我想要做的更小的原因是我想学习c ++ 11的特性,因为人们会开始编写代码,所以:

  1. #include<thread> #include<mutex>和boost等价物之间是否存在1:1映射?
  2. 你会考虑一个好主意,用c ++ 11替换增强的东西
    东东。 我的用法很简单,但是当std不提供什么提示时,有没有例子? 或(亵渎)反之亦然?

PS我使用GCC所以标题在那里。







在Visual Studio 2013中, std::mutex行为似乎与boost::mutex不同,后者导致了一些问题(请参阅此问题 )。




Related

c++ multithreading c++11 boost mutex