15

在过去五年中,主要从事 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 的非实体函数。

4

5 回答 5

15

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

但是,还有其他选择:

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

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

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

英特尔 TBB 是跨平台的(Windows*、Linux* 和 Mac OS* X),支持 32 位和 64 位应用程序,并可与英特尔、微软和 GNU 编译器一起使用。

OpenMP 取决于您要使用的编译器,但 GCC 和/或 Intel编译器已支持OpenMP Windows、Linux 和 MacOS。

于 2009-01-31T23:30:32.667 回答
11

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

这也不是一个很难解决的问题,并且可以成为创建跨平台代码的一个很好的练习。

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

这允许您使用最适合该平台的 API 来实现所有线程创建和睡眠/关闭/优先级代码。您可能还需要包含每个平台的定义/类型定义的标头(例如 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 等平台编写的所有跨平台线程代码的方式。对于互斥锁和信号量之类的东西,这也是一个很好的模式,如果你有线程,你肯定会在某些时候需要:)

于 2009-02-01T00:19:41.493 回答
4

不,pthread 通常在 Windows 上不可用。(有一些实现它的尝试,但至少操作系统不直接支持它。)

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

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

于 2009-01-31T23:23:51.073 回答
0

我会打赌 ZThread

简单的 API,比 PThreads 更易于使用且免费

于 2009-08-22T03:48:29.960 回答
0

也看看 ting: http ://code.google.com/p/ting/

它是 Windows 和 Linux 之间的跨平台。尚无 Mac OS 支持。

于 2010-03-17T13:39:51.833 回答