可移植的 C++ 多线程
Posted
技术标签:
【中文标题】可移植的 C++ 多线程【英文标题】:Portable C++ multithreading 【发布时间】:2012-04-20 14:03:13 【问题描述】:我正在用 C++ 语言编写一个使用多线程的库。由于我是在windows中开发的,所以我使用的是“Windows.h”中的方法和数据结构(如CreateThread
、HANDLE 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++ 多线程的主要内容,如果未能解决你的问题,请参考以下文章