【问题标题】:POSIX threads experience? (Or recommend better one)POSIX线程经验? (或者推荐更好的)
【发布时间】:2009-04-27 17:24:08
【问题描述】:

我正在寻找适用于 C++ 的轻量级多线程框架。我找到了 POSIX 线程。
请分享您使用 POSIX 线程的实践经验:在开始使用它之前,我想从真实的人那里了解它的优缺点,而不是从 wiki。
如果您实际上将它与任何东西(也许更好)进行比较,那么了解它们也会很有趣。

UPD:跨平台功能对我来说真的很重要,所以我会很感激所描述的这个方向。

UPD2:我已经使用过一个用于 QNX/Win32 的框架,但它不是轻量级的,而且 - 哦,我忘了提, - 它是商业的,不是免费的,但我需要免费的。

【问题讨论】:

    标签: c++ multithreading cross-platform pthreads


    【解决方案1】:

    我发现Boost.Threads 非常好,尤其是在 1.35 重写之后。 Windows 上的 POSIX 线程并不是那么简单,它是一个 C API,所以我肯定更喜欢 Boost。它拥有您需要的所有东西,便携且几乎不需要设置。

    【讨论】:

    • 你能澄清一下,为什么 Boost 更好?我不是很注重赢。我更喜欢调试支持/简单性/等等。
    • 正如 Anteru 所写:pthreads 是一个 C API,而 Boost 是一个 C++ 库。
    • Boost 也不是面向 Windows 的,而是跨平台的。与 pthreads 不同的是,它利用了 C++ 的特性,并根据 C++ 习惯用法进行设计。它通过 pthread 为您提供的一些东西是:类型安全、在向新线程传递参数时更灵活以及更简单的使用。 Boost 广泛使用 RAII,例如,要创建一个锁,您只需创建一个本地对象,当它超出范围时,锁就会被释放。比 pthread 更简单,在 pthread 中您必须显式调用函数来释放锁。 (如果你忘记了,或者抛出异常,你就完蛋了)
    • 另外,如果你使用 boost::thread,当 C++0x 被完全采用时,移植到 std::thread 会容易得多,因为 std::thread 与 boost::thread 非常相似.
    【解决方案2】:

    另一个 C 线程 API 是来自 GLib 的 GThreads。在一些 gthread 和 pthread 调用(例如 pthread_create)之间存在一对一的映射,但 gthread 有两个我发现非常有用的大特性:

    • 线程池和
    • 用于在线程之间发送消息的异步队列。

    线程池非常强大,可以动态调整池大小。见http://library.gnome.org/devel/glib/2.20/glib-Threads.html

    【讨论】:

      【解决方案3】:

      POSIX 线程 API 是 C API,而不是 C++。

      你想用它做什么?就个人而言,我发现它是一个非常笨拙且过于冗长的 API。但如果您想在类 Unix/Linux 操作系统上进行跨平台开发,这是您最好的选择。它在 Windows 上不受本机支持。

      就个人而言,我不会直接在您的代码中使用线程或任何其他依赖于操作系统的 API。在其之上构建另一个抽象层。例如,我们构建了我们所谓的“操作系统层”;一个用于处理线程、信号量、计时器、互斥锁等的 C++ 框架。我们的代码专门使用它。在底层,我们有针对 POSIX、Win32、INTEGRITY 和 vxWorks 的实现。这让我们的代码可以在各种平台上运行。

      如果您不想构建自己的层,可以考虑重用许多其他层,例如 Boost、Qt 等。

      【讨论】:

      • 谢谢,我将回复编辑为“Windows 上不支持原生”。如果你想在那里使用 pthreads,你也可以在 Windows 上使用 cygwin 路线。
      • 除非您真的想从事图书馆业务,或者除非您需要的东西如此简单以至于微不足道,否则不要自己编写。不同操作系统上的线程(例如 Windows 与 Linux)的工作方式非常不同,如果你没有在你的抽象中得到正确的结果,你最终会遇到问题。
      • “笨拙”是什么意思?是太低级还是别的什么?
      • @Michael Kohne:编写简单易用的包装器来隐藏不同的实现并不是什么大问题。在日常工作所需的 95% 功能中,线程的工作非常平等。
      • @Michael Kohne:围绕各种操作系统工具编写自己的 C++ 包装器确实相当容易。另外,我们不能在我们的环境(或其他 3rd 方实用程序)中使用 boost。
      【解决方案4】:

      我不久前使用 POSIX 编写了一个程序。它在 Linux 和 Solaris 上运行良好,实现起来也不是很复杂。另一方面,我的兄弟是一名 Windows 程序员,并且更喜欢 Posix。我想这取决于你的目标。我发现 boost 有点臃肿,并且听说过有关它的坏消息。我哥哥认为这是自切片面包以来最棒的事情。我想这是福特与雪佛兰的事情。每个人都会有意见。

      【讨论】:

        【解决方案5】:

        如果你不喜欢Boost 的线程API,那么你可能想看看POCO 的。

        【讨论】:

          【解决方案6】:

          正如您提到的 QNX,请查看 ACE。这是一个庞大的框架,可用于many platforms(包括 QNX)。 其他人已经提到了Boost

          建议您使用这些库之一,而不是使用低级、不可移植且容易出错的 C API。

          【讨论】:

            【解决方案7】:

            如果您使用 C++ 工作,Boost 线程库可能是您最好的选择。我在 Unix 和 win32 上都有非常积极的经验。避免 ACE - 糟糕的设计,错误的方法。也可以看看Intel TBB,虽然我没有在实践中使用过。

            【讨论】:

              【解决方案8】:

              我发现它与 win32 线程 API 非常相似,您需要注意的唯一(真正)区别是 win32 互斥锁在同一线程上使用时不会阻塞,而 posix 会阻塞。除此之外,它还是一个非常简单的 API。

              【讨论】:

              • 可以通过将它们标记为递归来避免 posix 上的互斥锁 (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE))
              猜你喜欢
              • 2019-04-06
              • 2019-07-14
              • 2011-03-20
              • 1970-01-01
              • 2017-12-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-07-18
              相关资源
              最近更新 更多