可移植的C++多线程技术

3
我正在用C++语言编写一个使用多线程的库。由于我在Windows上开发,所以我使用了“Windows.h”中的方法和数据结构(如CreateThreadHANDLE WINAPI等)。
现在我想让这个代码在Windows和Linux上都能执行。你能否向我推荐一些线程实现方式?
这个应用程序的主要要求是执行速度快,因此我需要一些快速的实现方式。
谢谢您提前的帮助。

6
C++11标准库支持多线程。 - cmannett85
@cbamber85 - 是的,但是要小心基于此提出的总体建议。 C ++11的实际编译器支持(一项非常重要的任务)正在进行中并且有所变化。 - Steve Townsend
@SteveTownsend 你说得对,我假设gcc并发支持的水平会与C++11语言支持类似 - 结果发现它远远不及。 - cmannett85
4个回答

12

你最好的选择是使用新的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 thread 库时遇到了一些小问题。线程可以正常运行,但关闭应用程序会生成一个 AV(可能是指程序异常退出的错误代码)。这个问题可能已经在后续版本中得到修复 - 我想我使用的是1.35版本,太老了:( - Martin James
根据这个线程,VC10中存在“std::thread”已知的问题。与此同时,最新版本的Boost可能是一个更好的选择。https://dev59.com/GGDVa4cB1Zd3GeqPgszQ - Steve Townsend
@MartinJames 1.35已经过时,对这个问题没有任何影响。 - 111111
@SteveTownsend 我肯定会尝试使用标准库,因为它有很多优点。VC11也即将推出,承诺会有定期更新。 - 111111


1

boost::thread是解决方案,同时std::thread也是新标准C++11中的一部分。


1
作为一种替代方案,一个相当便携(*)且相对不会干扰的库,很好地支持g++和(旧版本)MSVC,即OpenMP
它不是标准C++,但OpenMP本身是一个标准。它可以让您轻松地并行化循环:
#pragma omp parallel for
for (int i=0; i!=x; ++i) {
}

它还具有任务和时间能力(以及更多),但在我看来,它的王者学科是上面举例的并行处理。


(*) 如果你坚持使用编译指示,它并不是完全不可移植的。

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