【问题标题】:Is PThread a good choice for multi-platorm C/C++ multi-threading program?PThread 是多平台/C++ 多线程程序的好选择吗?
【发布时间】:2010-10-04 17:28:06
【问题描述】:

过去 5 年主要从事 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 中的无实体函数相反。

【问题讨论】:

    标签: c++ c multithreading pthreads portability


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      嗯,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 和/或 Intel compilers have supported OpenMP Windows、Linux 和 MacOS。

      【讨论】:

      • “因为后者在所有平台上都完全受支持” - 如果所有平台指的是 Windows 和几个 *nix 平台,那么这是真的。除此之外不是。
      • 查看我的编辑。除了这 3 个平台之外,OP 从未要求过任何其他东西。
      • 我接受了这个回复,因为它提供了最广泛的关于可能的方式的信息。
      • 是的,我想我会选择 boost:thread - 我也希望能够使用 C++ try/catch 异常处理。尽管我的程序是最小的并且不是特别 OOPish,我还是喜欢封装。
      • C++ 以更常见的“更好的 C”模式使用,先生,这是一个明智的选择,我希望你会喜欢。不过不要忘记 STL 和 Boost 的其余部分。
      【解决方案3】:

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

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

      我建议你创建一个类,例如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 等平台编写的所有跨平台线程代码的方式。对于互斥锁和信号量之类的东西,这也是一个很好的模式,如果你有线程,你肯定会在某些时候需要:)

      【讨论】:

      • 我喜欢它 - 来自可能从未在多个平台上发布过应用程序的人的匿名反对票! FTW!
      • 嘿安德鲁,我发布了原始问题。看到你的投票也被否决了,我有点惊讶。我已经在 Win32 线程上推出了瘦 C++ 类——我也只需要通过 POSIX Pthreads 抽象它就可以了。另一方面,有 Pthreads-win32。其他所有东西都已经有了 Pthreads。
      • +1:封装永远是你的朋友。这似乎是额外的工作,但最少的额外时间最终会节省你的时间。特别是当有人违反标准并且有意外的错误值要测试时。
      • +1,我与你同在,安德鲁。滚动您自己的解决方案还有一个额外的好处,即您只需为所需的内容付费,并且您可以了解基本原则,这将在您以后需要修复错误时有所帮助。
      【解决方案4】:

      我会赌ZThread

      API 简单,比 PThreads 和 FREE 更易于使用

      【讨论】:

      • 知道为什么我在使用 Zthread 库时会在控制台上收到这么多消息吗?如ThreadQueue createdUser thread created 等。这些似乎是来自库的DEBUG消息,如何关闭它们?
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-19
        • 2021-04-06
        • 2011-04-07
        • 2016-03-26
        • 1970-01-01
        • 2023-03-12
        • 2018-08-24
        • 1970-01-01
        相关资源
        最近更新 更多