C++ 11 std :: threads vs posix threads

Sha*_*dor 143 c++ multithreading pthreads c++11

为什么我在练习中更喜欢一个或另一个?什么是技术差异,除了std::thread是一个类?

Gun*_*iez 110

如果要在许多平台上运行代码,请选择Posix Threads.它们几乎可以在任何地方使用并且非常成熟.另一方面,如果你只使用Linux/gcc std::thread就完全没问题 - 它具有更高的抽象级别,一个非常好的界面,并且与其他C++ 11类很好地配合.

std::thread遗憾的是,C++ 11 类在每个平台上都不可靠(即使C++ 11似乎可用).例如,在原生Android std::thread或Win64中,它只是不起作用或具有严重的性能瓶颈(截至2012年).

一个很好的替代品boost::thread- 它非常类似于std::thread(实际上来自同一作者)并且可靠地工作,但是,当然,它引入了来自第三方库的另一个依赖.


编辑:截至2017年,std::thread主要适用于原生Android.有些类std::timed_mutex仍未实现.

  • 那么现在,2017年初呢? (22认同)
  • 您是否有任何证据支持这些"性能瓶颈"声明?此外,`std :: thread`及其raii-style是好的,因为它可以处理C++异常,而pthreads不能开箱即用. (18认同)
  • 那么现在,2018年中期呢? (12认同)
  • 现在在2014年,这个答案仍然有效吗? (9认同)
  • 那么现在,2017年中期呢? (7认同)
  • 那从2019年开始呢? (6认同)
  • 2019年中? (6认同)
  • 那么现在,2015年中期呢? (5认同)
  • 那么,2016年初呢? (4认同)
  • 那么现在,2016年结束呢? (4认同)
  • 现在怎么样,2018年结束? (4认同)
  • 自 2015 年以来,`std::thread` 在 Windows 上运行得很好。相反,VC++ 中不存在 POSIX 线程。 (4认同)
  • @Serthy至少在某种程度上 - 我正在努力交叉编译一个简单的程序(http://stackoverflow.com/q/30893684)它适用于我喜欢的gcc/linux环境,但是当我去编译ARMv7时应用程序即时终止.与std :: thread相比,pthreads是一个痛苦的屁股,但这个答案指出它的头部,"如果你想在许多平台上运行代码,请选择Posix Threads" (3认同)
  • 现在和永远使用“std::thread”。它是跨平台的,正如另一位回答者所说,它是面向未来的,并且不会遇到性能瓶颈。 (3认同)
  • 你使用了`std :: thread`的mingw版本吗?与MSVC相比,我预计性能会因为使用pthreads端口而受到影响,但MSVC应该没问题. (2认同)

Aki*_*shi 54

std::thread库是在支持pthreads的环境中的pthreads之上实现的(例如:libstdc ++).

我认为两者之间的巨大差异是抽象.std::thread是一个C++类库.该std::thread库包含许多抽象功能,例如:作用域锁,递归互斥锁,未来/承诺设计模式实现等.

  • "+ 1"来自我指出最重要的事情,即std :: thread提供更高级别的抽象. (4认同)

Bra*_*ady 30

std::thread 提供跨Windows,MacOS和Linux等不同平台的可移植性.

正如@hirshhornsalz在下面的评论和相关答案/sf/answers/919479781/中所提到的,std::thread可能尚未在所有平台上完成.即便如此,(它将在不久的将来)它应该受到青睐,pthread因为它应该使你的应用程序更具有前瞻性.

  • @hirschhornsalz,至于你的负面语气和不使用线程的指责,它们只是简单的非破坏性而且不值得我付出太多努力.我认为至少值得一提的是,更具建设性的评论可能是指出你曾尝试在不同平台上使用std :: thread的麻烦. (3认同)
  • 总而言之,c ++ 11 std :: thread仅可用于最新版本的GCC.它在Visual Studio中几乎不完整,因此无法在Windows上使用.当然,在UNIX上的商业编译器(Solaris上的Sun Studio,HP-UX上的HP aCC,AIX上的IBM vacpp)中绝对缺少它.因此,如果你的目标平台只是Linux - c ++ 11 std :: thread很好; 如果你还需要Windows或其他UNIX - boost :: thread是要走的路. (3认同)
  • 实际上,std :: threads提供了跨所有支持C++ 11的平台的可移植性,而POSIX线程仅适用于POSIX平台(或追求最小兼容性的平台). (2认同)
  • 从实际的 POV 来看,这是错误的。我实际上在几个月前就这个推理做出了决定——这是一个重大错误。在实践中你必须在 Win64 或 Bionic (Android) 上使用 `boost::thread`,因为 `std::thread` 仍然缺乏很大的部分,而在 Linux 上 `std::thread` 似乎已经相当成熟。 (2认同)

Was*_*lap 6

对我来说,决定性的技术差异是std中缺少信号处理原语而不是pthreads.单独使用std无法在Unix进程中正确地指示信号处理是AFAIK使用std :: thread的一个令人衰弱的缺陷,因为它禁止设置真正的多线程信号处理模式来处理专用的所有信号线程并阻止它们在其余部分.你被迫假设std :: thread是使用pthreads实现的,并希望在使用pthread_sigmask时最好.正确处理信号在企业的Unix系统编程中是不可协商的.

截至2016年,std :: thread是一个玩具; 就那么简单.

  • 我不同意.信号的大量使用是大多数应用都可以避免的设计模式. (6认同)