【问题标题】:boost::thread and std::thread compatibility issues?boost::thread 和 std::thread 兼容性问题?
【发布时间】:2014-06-05 21:23:23
【问题描述】:

我有一个关于将 boost::threads 与一些 c++11 标准项目混合和匹配的问题,这有效吗?我还没有真正测试过任何东西,但我正在使用一个使用所有 boost::threads 和线程组以及中断功能的系统,这些功能你没有按照标准开箱即用,所以没有改变。我们的 boost 1.50 版本没有最新的 std::atomic 和内存排序的东西。我想知道我是否可以将 std::atomic 和 std:: 内存排序操作 load/fectch_add 等(获取/释放,放松)与 boost 线程一起使用,并获得与 std::thread 相同的结果。这些都是我的 linux 机器上的 pthread,所以我想答案是肯定的,我可以混合搭配。虽然,我只是想确认一下是否有人在混合 boost::thread 和 std::thread apis 之间有任何兼容性问题。

【问题讨论】:

  • 我会更关心将 C++03 与 C++11 代码兼容的代码混合在一起。就个人而言,我仍然认为对 C++11 的“线程”支持基本上没有用,而且设计非常陈旧。
  • @user2485710 这是一个相当大胆的声明。你愿意证明为什么 C++11 线程支持“基本上没用”吗?
  • @JBentley 它不是基于任务的,它不支持“信号”或异步操作,std::async 基于线程,还有一些其他关于设计和实现的问题,例如std::future 的析构函数阻塞且设计不良。可能有一些有用的东西,但我真的不认为有人会用它来取得好成绩,而且在 C++14 中会有一些修改会以不同的行为影响 C++11 线程模型。跨度>

标签: c++ multithreading c++11 boost


【解决方案1】:

这是一个有趣的问题,自从 C++11 被广泛使用以来,我一直在思考这个问题。

一般来说,我注意到 std 组件的 boost 版本通常具有提供比 std 版本更多功能的扩展。例如,boost::bind 提供了比std::bind 更多的功能,boost <type_traits> 比 std 更丰富,boost::thread 允许线程取消/中断而 std 不允许,等等。

正如你提到的,特别是关于 boost 线程与 std 线程

...我正在使用一个使用所有 boost::threads 和线程组以及中断功能的系统,这些功能在标准中是开箱即用的...

我想指出,boost 线程中断取消并非没有代价,boost::condition_variable 在 boost 中启用线程取消时实际上是 boost::condition_variable_anyboost::condition_variable_any 维护自己的互斥体,并且比 boost::condition_variable 设计为轻量级包装器的原始 POSIX pthread_cond_t 进行更多锁定。线程中断功能adds measurable 5-10% speed overhead to boost::condition_variablecondition variable: std vs boost chart

我们的 boost 1.50 版本没有最新的 std::atomic 和内存排序的东西。我想知道是否可以将 std::atomic 和 std:: 内存排序操作 load/fectch_add 等(acquire/release,relaxed)与 boost 线程一起使用,并获得与 std::thread 相同的结果

std::atomic 库不使用或依赖特定线程库仅用于某些内置原子类型(整数和指针不超过自然平台宽度,例如 32 位或 64 位) 或平台,因此您可以根据需要将线程与原子库混合和匹配,只要您小心使用std::atomic<T> 其中T 的原子性由硬件支持(同样,整数和指针) ,您可以通过std::atomic<T>::is_lock_free() 进行检查。

【讨论】:

  • 感谢您提供的附加信息,因为我不知道 boost::condition_variable 真的是 boost::condition_variable_any
  • @bjackfly 有时我在 boost 中找不到某些东西的定义,所以我只需运行编译器命令行并将 -c 更改为 -E 并将 -o .../xyz.o 更改为 -o xyx.i 即可获得一个完全预处理的宏扩展翻译单元,我在其中仅使用 emacs 中的普通内联文本搜索来查找内容的定义。这就是我偶然发现boost::condition_variable 维护自己的互斥锁的方式,我觉得这不是我所期望的,这里发生了什么?...
【解决方案2】:

它不应该工作没有任何技术原因。 boost::thread 和 std::thread 都只是本地系统线程的包装器,所有同步机制都独立于你用来生成线程的东西。

【讨论】:

    【解决方案3】:

    仅供参考,this other thread表明在管理信号/终止时,boost线程和std线程之间确实存在一些兼容性问题: Preventing thread from calling std::terminate() on detach after handled exception:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-21
      • 2013-11-26
      • 1970-01-01
      • 2012-05-23
      • 2020-12-15
      • 1970-01-01
      • 2015-12-01
      • 2012-01-22
      相关资源
      最近更新 更多