过去五年来一直主要使用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无实体的功能相反。
答案 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支持。