【问题标题】:boost::thread vs std::thread vs pthreadboost::thread vs std::thread vs pthread
【发布时间】:2020-12-21 14:13:20
【问题描述】:

对于基于 Linux 的应用程序的高 CPU 吞吐量(阅读:大量浮点运算),有哪些权衡 b/w boost::threadstd::thread (C++11) 和 pthread?什么时候应该使用一种实现而不是其他实现?

这里的用例是在连续内存的缓冲区(或指向缓冲区的指针)上调用例程,做一些工作,然后在多线程实现中返回。

【问题讨论】:

  • 我想说,这三个之间应该没有明显的区别(如果我是对的,std::thread 来自 boost::thread)。前两个也依赖于支持 pthread 的平台上的 pthread。 pthread 可能具有优势的唯一情况是使用 std/boost::thread 不支持的某些 pthread 特定功能。
  • 除非您不断创建大量线程并大量使用同步原语,否则不会有性能差异。浮点性能不受线程 API 的影响。 std::thread 的优点是在标准库中并且可移植,boost::thread 有一些额外的功能,而pthread 仅在 POSIX 上可用。
  • 对于lots of floating point operations,最好使用ompeigenOpenCVOpenCL 之类的替代方案,具体取决于应用程序。例如,使用OpenCL,您可以将并行操作移至当前具有大量浮点功能(比 CPU 更多)的显卡。
  • 太多人认为线程是“对抗性”术语,例如单独的进程,而不是协作术语。取消之类的概念是一个错误,std::thread 避免了。分离的线程是另一个错误。这两者都使得确定性执行和资源展开 (RAII) 变得非常困难。如果可用的话,我想不出不使用 C++ 标准线程工具的充分理由。

标签: c++ multithreading c++11 pthreads boost-thread


【解决方案1】:

唯一受标准支持的是std::thread,如果您的构建工具允许 C++11 或更高版本,您应该使用它。它是boost::thread 的派生但标准化版本。

Pthreads 是特定于平台的线程实现,std::thread 由 C++11 标准保证。通常在类似 POSIX 的系统上,std::thread 在内部使用 pthread。

【讨论】:

    【解决方案2】:
    • std::thread
      • Pro:标准;保证在所有符合标准的平台上。
      • Con:需要 C++11,因此不能与 Ancient 一起使用。编译器。只有基本的、最低的公分母特征。但是,仍然可以通过std::thread::native_handle 使用平台特定功能。
    • boost::thread
      • Pro:是跨平台的,支持古老的编译器。
      • 缺点:不标准;需要外部依赖。与标准线程类似的功能集。
    • pthread:
      • 专业版:具有更多功能,例如调度策略。
      • Con:仅适用于 POSIX 系统,不包括 Windows。非 RAII 接口。

    什么时候应该使用一种实现而不是其他实现?

    std::thread 通常是一个很好的默认值。如果您需要标准中没有的pthread 的功能,您可以在std::thread::native_handle 的帮助下使用它们(这会影响随之而来的可移植性)。没有理由在 C++ 中直接使用 pthread(据我所知)。

    如果您需要古老的 pre-C++11 支持,可以使用boost::thread,以保持对其他系统的可移植性。


    注意std::thread 本身不需要直接使用。该标准具有有用的抽象,例如std::reducestd::packaged_taskstd::async、算法的并行执行策略等。

    【讨论】:

    • pthreads 的另一个缺点是,AFAIK,它没有本地 C++ API。
    • 请注意,std::thread::native_handle 的可移植性问题不仅仅局限于操作系统。根据 C++ 标准,该名称不需要存在;如果确实存在,则其含义完全由实现定义。
    • pthread_self 可以改为使用,但这仅在线程内有效。定义的实现虽然很好。如果实现将其定义为返回您需要的内容,那么您就可以开始了。如果没有,那么它可能一开始就没有使用 pthread。
    • 公平地说,POSIX 上的几乎所有实现都将在下面使用 pthreads,std::thread::native_handle 实际上将是 pthreads 句柄,所有可以在其上完成的操作。
    猜你喜欢
    • 2011-01-11
    • 2019-09-27
    • 2013-05-22
    • 2020-12-15
    • 2014-10-02
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多