在过去的五年里,我一直在做Java和一些.NET,而且在那段时间里没有写过任何重要的C或C++.所以离开那个场景一段时间了.
如果我今天要编写一个C或C++程序来执行一些多线程并且可以跨Windows,Mac OS X和Linux/Unix移植源代码 - 那么PThread是一个不错的选择吗?
C或C++代码不会执行任何GUI,因此不需要担心任何这些.
对于Windows平台,我不想在unix仿真运行时库方面带来很多Unix包袱.更喜欢用于Windows的PThread API,它是现有Windows线程API的尽可能薄的包装器.
附录编辑:
我倾向于使用boost:thread - 我也希望能够使用C++ try/catch异常处理.即使我的程序相当简单而且不是特别OOPish,我喜欢使用类和命名空间封装 - 而不是C无实体的函数.
gbjbaanb.. 15
好吧,pthreads是编写线程程序的旧posix标准.它是最低级别的线程例程,因此它是跨平台线程的不错选择.
但是,还有其他选择:
boost :: thread - 一个STL样式的线程库
英特尔的线程构建模块
OpenMP - 这些都是编写线程应用程序的更高级别的方式,无需进行任何线程调用.
由于后者在所有平台上都得到完全支持,(pthreads需要一些编译器设置作为Windows posix子系统的唯一部分,除非你想使用Pthreads-w32),那么后者可能是更好的选择.boost :: threads更像是一个线程库,另外两个是实现并行性的高级方法,无需编写'线程',它们允许你编写自动并发运行的循环(受常识条件限制)
但是,Boost :: thread不是C兼容的库.
编辑:以上的跨平台能力:
英特尔TBB是跨平台的(Windows*,Linux*和Mac OS*X),支持32位和64位应用程序,可与英特尔,微软和GNU编译器配合使用.
OpenMP依赖于您要使用的编译器,但GCC和/或英特尔编译器支持 OpenMP Windows,Linux和MacOS.
好吧,pthreads是编写线程程序的旧posix标准.它是最低级别的线程例程,因此它是跨平台线程的不错选择.
但是,还有其他选择:
boost :: thread - 一个STL样式的线程库
英特尔的线程构建模块
OpenMP - 这些都是编写线程应用程序的更高级别的方式,无需进行任何线程调用.
由于后者在所有平台上都得到完全支持,(pthreads需要一些编译器设置作为Windows posix子系统的唯一部分,除非你想使用Pthreads-w32),那么后者可能是更好的选择.boost :: threads更像是一个线程库,另外两个是实现并行性的高级方法,无需编写'线程',它们允许你编写自动并发运行的循环(受常识条件限制)
但是,Boost :: thread不是C兼容的库.
编辑:以上的跨平台能力:
英特尔TBB是跨平台的(Windows*,Linux*和Mac OS*X),支持32位和64位应用程序,可与英特尔,微软和GNU编译器配合使用.
OpenMP依赖于您要使用的编译器,但GCC和/或英特尔编译器支持 OpenMP Windows,Linux和MacOS.
如果您需要您的代码真正可移植,那么最好远离散布互联网的各种库.在某些时候,你会找到一个他们不支持的平台,然后必须创建自己的分支.
这也不是一个难以解决的问题,可以很好地用于创建跨平台代码.
我建议你创建一个类,例如CThread,它为每个平台提供单独的.cpp实现,以及在构造/运行线程后调用的纯虚拟execute()函数.
这允许使用最适合的平台API实现所有线程创建和睡眠/关闭/优先级代码.您可能还需要一个包含每个平台的define/typedef的标头(例如ThreadTypes.h).
例如
// ThreadTypes.h #if defined(PLATFORM_WIN) || defined(PLATFORM_XBOX) typedef DWORD ThreadID #elif defined(PLATFORM_PS3) // etc etc #endif
这就是我为PC/PS2/PS3/360/Wii等平台编写所有跨平台线程代码的方法.对于像互斥锁和信号量这样的东西来说,它也是一个很好的模式,如果你有线程,你肯定需要在某些时候:)