C++11 std::thread 与 Posix 线程

问题描述 投票:0回答:5

为什么我在实践中应该选择其中之一? 除了

std::thread
是一个类之外,还有哪些技术差异?

c++ multithreading c++11 pthreads std
5个回答
140
投票

如果您想在多个平台上运行代码,请选择 Posix Threads。它们几乎随处可见,而且相当成熟。另一方面,如果您只使用 Linux/gcc

std::thread
则完全没问题 - 它具有更高的抽象级别、非常好的接口并且可以与其他 C++11 类很好地配合。

不幸的是,C++11

std::thread

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

一个很好的替代品是

boost::thread

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


编辑:截至 2017 年,

std::thread

 主要适用于原生 Android。有些类,如 
std::timed_mutex
 仍未实现。


74
投票

std::thread

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

我认为两者之间最大的区别在于抽象。

std::thread

是一个C++类库。 
std::thread
 库包含许多抽象功能,例如:作用域锁、递归互斥体、未来/承诺设计模式实现等等。


41
投票

std::thread

 提供跨不同平台(如 Windows、MacOS 和 Linux)的可移植性。

正如 @hirshhornsalz 在下面的评论和相关答案中提到的

https://stackoverflow.com/a/13135425/1158895std::thread

 可能尚未在所有平台上完成。即便如此,(这将是在不久的将来)它应该比 
pthread
 更受青睐,因为它应该使您的应用程序更加面向未来。


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

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


0
投票
我刚刚发现

std::thread

 对 POSIX 线程没有的线程数量施加了限制。看来 C++ 中的线程创建会检查名为 
systemd
DefaultTasksMax
 属性,而 Posix 
libpthread
 不会检查该属性。

我很快就会用 C++ 和 C 中的片段更新这个答案,这些片段似乎证明了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.