C 11 STD ::线程与POSIX线程

C++11 std::threads vs posix threads

本文关键字:线程 POSIX STD      更新时间:2023-10-16

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

如果要在许多平台上运行代码,请选择POSIX线程。它们几乎到处都可以买到,而且很成熟。另一方面,如果您仅使用Linux/GCC std::thread非常好 - 它具有较高的抽象水平,一个非常好的界面,并且与其他C 11类播放。

不幸的是,即使C 11似乎可用,C 11 std::thread类在每个平台上都无法可靠地工作。例如,在本地Android std::thread或Win64中,它只是不起作用或具有严重的性能瓶颈(截至2012年)。

一个很好的替代品是boost::thread-它与std::thread非常相似(实际上是来自同一作者),并且可靠地工作,但是,当然,它从第三方库中介绍了另一种依赖性。


编辑:截至2017年,std::thread主要在本机Android上工作。有些类,例如std::timed_mutex仍未实现。

std::thread库是在支持pthreads的环境中的pthreads顶部实现的(例如:libstdc )。

我认为两者之间的最大差异是抽象。std::thread是C 类库。std::thread库包含许多抽象功能,例如:示波器锁,递归静音,未来/承诺设计模式实现等等。

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

@hirshhornsalz在下面的评论和相关答案中提到https://stackoverflow.com/a/113135425/1158895,std::thread可能还不在所有平台上完成。即便如此,(它将在不久的将来)应该比pthread的偏爱,因为它应该使您的应用程序更具未来。

对我而言,决定技术差异是缺乏STD中的信号处理原始物,而不是Pthreads。仅使用STD在UNIX过程中正确指示信号处理的情况是Afaik是一个使人衰弱的缺陷,因为它禁止一个人设置真正的多线程信号处理模式,以便在专用的所有信号中设置真正的信号螺纹并将其挡在其余部分中。您被迫假设使用pthreads实现std ::螺纹,并在使用pthread_sigmask时获得最佳状态。在企业的UNIX系统编程中,正确处理信号是不可谈判的。

截至2016年,STD ::线程是一个玩具;很简单。