Rog*_*erV 15 c c++ multithreading portability pthreads
在过去的五年里,我一直在做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无实体的函数.
gbj*_*anb 15
好吧,pthreads是编写线程程序的旧posix标准.它是最低级别的线程例程,因此它是跨平台线程的不错选择.
但是,还有其他选择:
由于后者在所有平台上都得到完全支持,(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.
And*_*ant 11
如果您需要您的代码真正可移植,那么最好远离散布互联网的各种库.在某些时候,你会找到一个他们不支持的平台,然后必须创建自己的分支.
这也不是一个难以解决的问题,可以很好地用于创建跨平台代码.
我建议你创建一个类,例如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
Run Code Online (Sandbox Code Playgroud)
这就是我为PC/PS2/PS3/360/Wii等平台编写所有跨平台线程代码的方法.对于像互斥锁和信号量这样的东西来说,它也是一个很好的模式,如果你有线程,你肯定需要在某些时候:)
不,pthreads 通常在 Windows 上不可用。(有一些实现它的尝试,但至少操作系统不直接支持它。)
如果您正在编写 C++,那么 Boost 就是通常的答案。Boost.Thread 有一个可移植(并且更安全)的线程库。
在 C 中,最简单的解决方案可能是为 pthread 和 Windows 线程 API 编写一个通用包装器。
| 归档时间: |
|
| 查看次数: |
10779 次 |
| 最近记录: |