boost::thread和std::thread兼容性问题?

7
我有一个关于混合使用boost::threads和一些C++11标准项目的问题,这能行吗?我尚未测试任何内容,但我正在使用一个使用所有boost::threads和线程组以及中断功能的系统,这是标准库中没有的。我们的boost版本是1.50,没有最新的std::atomic和memory ordering stuff。我想知道是否可以在boost线程中使用std::atomic和std::memory ordering操作load/fetch_add等(acquire/release,relaxed),并获得与std::thread相同的结果。在我的linux机器上,这些都是在底层使用pthreads,因此我认为答案是可以混合使用。虽然如此,我只是想确认一下,并看看是否有人在混合使用boost::thread和std::thread api方面遇到兼容性问题。

我更担心混合使用旨在符合C++03标准的代码和C++11代码。就个人而言,我仍然认为C++11的“线程”支持基本无用,并且设计非常陈旧。 - user2485710
3
这是一个相当大胆的说法。您能解释一下为什么 C++11 的线程支持“基本上没用”吗? - JBentley
1
@JBentley 这个不是基于任务的,也没有对“信号”或异步操作提供支持,std::async 是基于线程的,还有一些关于设计和实现的问题,比如 std::future 的析构函数是阻塞的且设计不佳。可能有一些有用的东西,但我真的不认为有人能够通过它取得好的成果,而且在 C++14 中会有一些修改,这将影响到 C++11 的线程模型并带来不同的行为。 - user2485710
3个回答

4

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

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

特别是关于boost线程和std线程,就像你所提到的:

...我正在使用一个使用所有boost::threads和线程组以及您不能从标准中获得的中断功能的系统...

我想指出,启用boost线程中断取消功能并不是没有代价的。当在boost中启用线程取消时,boost::condition_variable实际上是boost::condition_variable_any。boost::condition_variable_any维护自己的互斥锁,并且比原始的POSIX pthread_cond_t执行更多的锁定操作,而boost::condition_variable旨在成为轻量级包装器。线程中断功能会给boost::condition_variable带来可测量的5-10%的速度开销。 添加链接 条件变量:std vs boost图表 我们的boost 1.50版本没有最新的std::atomic和内存排序功能。我想知道我是否可以使用std::atomic和std::memory ordering操作load/fetch_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
1
有时我在boost中找不到某个东西的定义,所以我会运行编译器命令行,并将“-c”更改为“-E”,将“-o .../xyz.o”更改为“-o xyx.i”,以获取完全预处理的宏扩展翻译单元,在其中使用emacs中的纯文本搜索查找东西的定义。这就是我偶然发现boost::condition_variable维护其自己的互斥锁的方式,我当时感到很意外,想知道这里到底发生了什么... - Maxim Egorushkin

0

0

从技术上讲,没有任何理由它不能工作。boost::thread和std::thread都只是本地系统线程的包装器,所有同步机制都独立于您用于生成线程的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接