172

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

4

4 回答 4

131

如果您想在许多平台上运行代码,请选择 Posix Threads。它们几乎随处可见,并且非常成熟。另一方面,如果您只使用 Linux/gccstd::thread则完全没问题——它具有更高的抽象级别、非常好的接口并且可以与其他 C++11 类很好地配合使用。

std::thread不幸的是,即使 C++11 似乎可用,C++11类也不能(还)在每个平台上可靠地工作。例如,在原生 Androidstd::thread或 Win64 中,它只是无法正常工作或存在严重的性能瓶颈(截至 2012 年)。

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


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

于 2012-10-30T08:47:40.597 回答
69

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

我认为两者之间的最大区别是抽象。std::thread是一个 C++ 类库。该std::thread库包含许多抽象特性,例如:作用域锁、递归互斥锁、future/promise 设计模式实现等。

于 2012-10-30T08:15:43.060 回答
39

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

正如@hirshhornsalz 在下面的评论和相关答案https://stackoverflow.com/a/13135425/1158895中提到的,std::thread可能尚未在所有平台上完成。即使如此,(它将在不久的将来)它应该比pthread's 更受青睐,因为它应该使您的应用程序更加面向未来。

于 2012-10-30T07:09:03.960 回答
9

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

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

于 2016-07-20T05:01:37.090 回答