C++中是否有任何跨平台的线程库?

26

我正在寻找一些易于使用的跨平台线程库,用C++编写。

你对boost::threadPthreads有什么看法?Pthreads只在符合POSIX标准的系统上运行吗?

Qt库中的线程支持怎么样?

12个回答

33
Boost.Thread是C++语言即将推出的标准线程库的草案。因为它会成为标准,所以我更喜欢使用它,因为它提供了一些强有力的保证。
更新:现在我们已经有了标准的线程库,需要注意的是,一些boost构造(例如boost::shared_mutex)尚未被标准化(但可能稍后会被标准化)。然而,标准库更好地利用了移动语义。在选择库之前了解这些信息很重要。此外,使用C++11线程库需要一个提供该库的编译器。今天并不是所有编译器都支持它。
更新:现在大多数标准编译器都提供C++11线程库(截至2012年11月)。VS2012、GCC4.8和Clang3.1都支持线程、同步原语和原子操作。您还可以使用Anthony Williams的just thread来实现完整的库。它是一个在Windows/Mac和Linux上支持C++11的兼容库。
以下是各种编译器支持C++11功能的链接:

我知道这个答案有点老了,但是我想补充一下,在C++11模式下,gcc 4.6无法编译Boost.Thread。这可能是其中任何一个问题,但最有可能的是gcc,因为C++11支持目前正在开发中。 - Tamás Szelei
我还要补充一点,如果要使用标准线程库,你仍然需要有提供该库的编译器,否则就得依赖于boost。 - Klaim

9

C++11自带一个线程库,它是建立在Boost线程库之上的。不幸的是,我似乎记得Boost.Threads和C++11提供的线程库之间存在着不容易解决的差异。但是,如果你计划切换到C++标准线程库,我相信Boost.Threads是目前最接近的选择。

我想,在底层,这些库将使用POSIX系统上的Pthreads以及其他地方可用的本机线程支持。

免责声明:我没有使用过这两个库中的任何一个。


4
此外,请参考OpenMP,它是一组(有些标准的)pragma规范,被大多数主要编译器支持。 OpenMP 的好处在于它简单易懂,您的代码可以轻松编译为单线程和多线程版本。
以下是一个简单的示例:
std::vector<double> a, b;
...
double sum = 0.0;
...
#pragma omp parallel for reduction(+:sum)
  for (i=0; i < n; i++)
    sum = sum + (a[i] * b[i]);

显然,也可以做更复杂的事情,例如这里这里以及这里


OpenMP也支持Windows吗? - NumberFour
是的,OpenMP在Windows上得到支持,包括Visual Studio 2005及更高版本,当然还有英特尔编译器。 - Chris O
它不应该引入任何依赖关系。 - baol
但事实是,OpenMP 更适合于并行任务执行,而不仅仅是处理同步、互斥等常规线程。对吧?我的意思是,OpenMP 不仅适用于创建多线程服务器之类的东西。 - NumberFour
OpenMP 绝对有同步原语,但是我不会使用它来编写 Web 服务器。 - baol

4

Pthreads 只能运行在 POSIX 系统上。使用来自 QtQThread 是一种可行的方式。它可以在以下平台上使用:Linux、Mac OS X、Windows、嵌入式 Linux、Windows CE、Symbian 和 Maemo。


2
你说的“所有平台”是什么意思? - osgx
3
是的,我在我的烤面包机上有这个芯片,Qt可用吗?:) - sbi
官方支持,win/mac/unix+x/嵌入式unix/wince/symbian/meamo - 可能比boost支持的还要多。 - Martin Beckett
如果您的设备提供足够的内存,那么是的。 - zoli2k
@shakov:这里卖的面包,烤面包的内存非常有限,但我想我可以在表面刻上几个数字。但是,它的寿命真的太短暂,不值得费那么大劲儿。 :) - sbi

3

我很惊讶没人提到Intel TBB库(链接到我的另一个回答)。此外,基于任务的实现应优先于基于线程的实现。


是的,C++11中的future-async模型也很容易使用。对于Windows来说,PPL与TBB非常相似,并且得到了微软的良好支持。 - Sarang

2

Qt拥有相当不错的线程支持。如果您只需要创建一个线程并在其中运行一些代码,那么QThread就足够了。还有许多其他高级类可以帮助您处理线程池,甚至可以抽象并发执行(QtConcurrent框架)。


1
Qt确实拥有一个很好的线程库;它非常适用于Qt应用程序,因为您可以跨线程连接信号。如果您正在使用Qt元素,则建议使用Qt线程。 - Will

2
列出相关平台。如果你只使用Linux/Mac/Windows,那么boost::thread可能已经可以满足你的需求,直到C++0x(哈哈)提供std::thread为止。

2

我曾经使用pthreads编写可以在多个平台上运行的代码。为了解决Windows缺乏pthreads的问题,我成功地使用了以下开源库:POSIX Threads for Windows


pthreads-w32已经过时了。mingw-w64提供了一个改进版本,叫做winpthreads。 - user519179

1

wxWidgets拥有线程类,而且由于wxWidgets是跨平台的,它可能是最适合您的东西。


1

Boost.Threads在UNIX系统上基于PThreads构建,在Windows上基于Win32 Threads。

Boost库在语法上非常简单,所有与C++代码正确接口C库的复杂业务都在幕后处理。然而,如果您对C++不是很熟悉,PThreads可能会更直观,因为它具有简单的C API。

Qt Threads也是一个很好的库,但由于我使用了其他几个boost库,所以无论如何我都会编译和链接Boost。我可能不会总是链接Qt。而且,我只是不想记住如何使用两个不同的库。


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