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



Answers

std::thread主要是在boost::thread之后建模的,有一些不同之处

  • boost的不可复制的单处理映射到单一线程的语义被保留。 但是这个线程是可移动的,以允许从工厂函数返回线程并放入容器中。
  • 这个建议增加了对boost::thread取消,这是一个非常复杂的问题。 这个改变不仅对线程有很大的影响,而且对C ++线程库的其他部分也有很大的影响。 据信这种巨大的变化是有道理的,因为有利。
    • 线程析构函数现在必须在分离之前调用取消,以避免父线程被取消时意外泄漏子线程。
    • 现在需要明确的分离成员来启用分离而不取消。
  • 线程句柄和线程标识的概念已被分为两类(它们是boost::thread中的相同类)。 这是为了支持更简单的操作和存储线程标识。
  • 已经添加了创建线程ID的能力( boost::thread没有这个),该线程id保证与其他可连接线程的比较相等。 对于想要知道它是否被前一个调用的同一线程执行的代码(递归互斥是一个具体的例子),这是很方便的。
  • 存在一个“后门”来获取本地线程句柄,以便客户端可以根据需要使用底层操作系统处理线程。

这是从2007年开始的,所以有些点不再有效: boost::thread现在有一个native_handle函数,正如评论者指出的那样, std::thread不再有取消。

我找不到boost::mutexstd::mutex之间的任何显着差异。

Question

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

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

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




我试图从std中使用shared_ptr而不是boost,而且我实际上在这个类的gcc实现中发现了一个bug。 我的应用程序崩溃了,因为析构函数调用了两次(这个类应该是线程安全的,不应该产生这样的问题)。 移动到boost :: shared_ptr后,所有问题都消失了。 目前C ++ 11的实现还不成熟。

Boost也有更多的功能。 例如标准版本中的头文件不会将串行器提供给流(即cout << duration)。 Boost拥有许多使用自己的等价物的库,但不与标准版本合作。

总结一下 - 如果你已经有了一个使用boost编写的应用程序,保持你的代码更加安全,而不是花费一些精力去使用C ++ 11标准。




企业案例

如果你正在为企业编写软件,而这些软件需要在中等到大量的操作系统上运行,并且因此在这些操作系统上使用各种编译器和编译器版本(尤其是相对较旧的版本),我的建议是远离现在完全是C ++ 11。 这意味着你不能使用std::thread ,并且我会推荐使用boost::thread

基本/技术启动案例

如果您正在编写一个或两个操作系统,您肯定知道您将只需要使用大多数支持C ++ 11的现代编译器(例如VS2015,GCC 5.3,Xcode 7)构建,而且您还没有依赖于boost库,那么std::thread可能是一个不错的选择。

我的经验

我个人偏向于强化,大量使用,高度兼容,高度一致的库,如增强型与非常现代的替代品。 对于线程等复杂的编程主题尤其如此。 另外,我在很多环境,编译器,线程模型等方面都经历了boost::thread (以及一般的boost)的巨大成功。当我选择时,我选择boost。




Links