可移植的 C++ 多线程

Posted

技术标签:

【中文标题】可移植的 C++ 多线程【英文标题】:Portable C++ multithreading 【发布时间】:2012-04-20 14:03:13 【问题描述】:

我正在用 C++ 语言编写一个使用多线程的库。由于我是在windows中开发的,所以我使用的是“Windows.h”中的方法和数据结构(如CreateThreadHANDLE WINAPI等)。

现在我想让这段代码在 Windows 和 Linux 中都可以执行;你能建议我一些线程实现吗?

这个应用程序的主要要求是执行速度,所以我需要一些快速的实现。

提前致谢。

【问题讨论】:

C++11标准库支持多线程。 @cbamber85 - 是的,这是真的,但要警惕基于此的一揽子建议。对 C++11 的实际编译器支持(一项不平凡的任务)是持续的且可变的。 @SteveTownsend 你说得对,我认为 gcc 并发支持将与 C++11 语言支持处于相似水平 - 结果还差得很远。 【参考方案1】:

到目前为止,您最好的选择是使用新的 std::threads 库,它是可移植的、标准化的,并且以现代风格编写。

 std::thread my_thread(my_func, my_param);

http://en.cppreference.com/w/cpp/thread

如果您无法访问 C++11(VC10 和 >gcc 4.4 应该没问题),那么 std::threads 或多或少是伟大的 boost::threads 的开发,boost 库是跨平台和便携(至少它会支持包括Win32 & linux在内的主要操作系统)。

http://www.boost.org/doc/libs/1_49_0/doc/html/thread.html

最后,如果您正在寻找并行算法,不妨看看英特尔的 TBB,这是一个现代 C++ 线程库,提供类似于 std:: 算法的并行结构

tbb::for_each(my_contaier.begin(), my_container.end(), my_func);

http://threadingbuildingblocks.org/

【讨论】:

我对 Windows 中早期的 boost 线程库有一些小问题。线程运行正常,但关闭应用程序会生成 AV。它可能在以后的版本中全部修复了 - 我想我有 1.35,它已经很老了:( 根据该线程,std::thread 的 VC10 中存在已知问题。与此同时,最新的 Boost 可能是一个更好的选择。 ***.com/questions/9421235/… @MartinJames 1.35 已经过时,在这个问题上没有权重。 @SteveTownsend 我肯定会尝试一下,使用标准库有很多优点。无论如何,VC11 即将到来,并承诺定期更新。【参考方案2】:

作为替代方案,OpenMP 是一个非常可移植 (*) 且相对非侵入性的库,在 g++ 上得到很好的支持,在 MSVC 上(带有旧版本)是 OpenMP。

它不是标准的 C++,但 OpenMP 本身就是一个标准。它让您可以轻松地并行化循环:

#pragma omp parallel for
for (int i=0; i!=x; ++i) 

它还具有任务和计时功能(以及更多),但在我看来,它的王道是上面的例子。


(*) 如果你坚持使用编译指示,它根本就不是不可移植的。

【讨论】:

【参考方案3】:

boost::thread 也是新标准 C++11 中 std::thread 的解决方案。

【讨论】:

【参考方案4】:

Boost.Thread

http://www.boost.org/libs/thread

【讨论】:

以上是关于可移植的 C++ 多线程的主要内容,如果未能解决你的问题,请参考以下文章

C++最佳实践 | 5. 可移植性及多线程

C++ 11 多线程编程之线程类

C++11 并发编程基础:并发并行与C++多线程

C++ 线程的使用

C++最佳实践 | 1. 工具

C++最佳实践 | 6. 性能