PThread是多平台/ C ++多线程程序的不错选择吗?

时间:2009-01-31 23:18:04

标签: c++ c multithreading pthreads portability

过去五年来一直主要使用Java和一些.NET,并且在此期间没有编写任何重要的C或C ++。所以离开那个场景一段时间了。

如果我今天要编写一个C或C ++程序来执行某些多线程并且可以跨Windows,Mac OS X和Linux / Unix移植源代码 - 那么PThread是一个不错的选择吗?

C或C ++代码不会执行任何GUI,因此不需要担心任何这些。

对于Windows平台,我不想在unix仿真运行时库方面带来很多Unix包袱。更喜欢用于Windows的PThread API,它是现有Windows线程API的尽可能薄的包装器。

ADDENDUM EDIT:

  

我倾向于一起去   提升:线程 - 我也希望能够   使用C ++ try / catch异常   处理也是。即使我的   程序将是相当小的而不是   尤其是OOPish,我喜欢   使用类和命名空间封装    - 与C无实体的功能相反。

5 个答案:

答案 0 :(得分:15)

嗯,pthreads是编写线程程序的旧posix标准。它是最低级别的线程例程,因此它是跨平台线程的不错选择。

然而,还有其他选择:

由于后者在所有平台上都得到完全支持,(pthreads需要一些编译器设置作为Windows posix子系统的唯一部分,除非你想使用Pthreads-w32),那么后者可能是更好的选择。 boost :: threads更像是一个线程库,另外两个是实现并行性的高级方法,无需编写'线程',它们允许你编写自动并发运行的循环(受常识条件限制)

Boost :: thread虽然不是C兼容的库。

编辑:以上的跨平台能力:

  

Intel TBB is cross-platform(Windows *,   Linux *和Mac OS * X)支持   32位和64位应用程序和   适用于英特尔,微软和GNU   编译器。

OpenMP取决于您要使用的编译器,但GCC和/或英特尔compilers have supported OpenMP Windows,Linux和MacOS。

答案 1 :(得分:11)

如果您需要您的代码真正可移植,那么最好远离散布互联网的各种库。在某些时候,你会找到一个他们不支持的平台,然后必须创建自己的分支。

这也不是一个难以解决的问题,对于创建跨平台代码也是一个很好的练习。

我建议你创建一个类,例如CThread,它为每个平台提供单独的.cpp实现,以及在构造/运行线程后调用的纯虚拟execute()函数。

这允许使用最适合的平台API实现所有线程创建和睡眠/关闭/优先级代码。您可能还需要一个包含每个平台的define / typedef的标头(例如ThreadTypes.h)。

E.g。

// ThreadTypes.h
#if defined(PLATFORM_WIN) || defined(PLATFORM_XBOX)
  typedef DWORD ThreadID
#elif defined(PLATFORM_PS3)
  // etc etc
#endif

这就是我为PC / PS2 / PS3 / 360 / Wii等平台编写所有跨平台线程代码的方法。对于像互斥锁和信号量这样的东西来说,它也是一个很好的模式,如果你有某些线程,你肯定需要这些线程:)

答案 2 :(得分:4)

不,Windows上通常不提供pthreads。 (实现它有一些尝试,但至少直接操作系统不支持它。)

如果您正在编写C ++,Boost就像往常一样,是答案。 Boost.Thread有一个可移植(且更安全)的线程库。

在C语言中,最简单的解决方案可能是为pthread和Windows线程API编写一个通用的包装器。

答案 3 :(得分:0)

我会打赌ZThread

简单的API,比PThreads和免费

更容易使用

答案 4 :(得分:0)

还要看看: http://code.google.com/p/ting/

它是Windows和Linux之间的跨平台。还没有Mac OS支持。