为什么我在练习中更喜欢一个或另一个?
什么是技术差异,除了std::thread
是一个类?
答案 0 :(得分:102)
如果要在许多平台上运行代码,请选择Posix Threads。它们几乎可以在任何地方使用并且非常成熟。另一方面,如果你只使用Linux / gcc std::thread
就完全没问题了 - 它有一个更高的抽象级别,一个非常好的界面,可以很好地与其他C ++ 11类一起使用。
std::thread
类在每个平台上都不可靠(即使C ++ 11似乎可用)。例如,在原生Android std::thread
或Win64中,它只是不起作用或存在严重的性能瓶颈(截至2012年)。
一个好的替代品是boost::thread
- 它与std::thread
非常相似(实际上它来自同一作者)并且可靠地工作,但是,当然,它引入了来自第三方库的另一个依赖项
编辑:截至2017年,std::thread
主要适用于原生Android。某些类,例如std::timed_mutex
仍未实现。
答案 1 :(得分:49)
std::thread
库是在支持pthreads的环境中的pthreads之上实现的(例如:libstdc ++)。
我认为两者之间的巨大差异是抽象。 std::thread
是一个C ++类库。 std::thread
库包含许多抽象功能,例如:作用域锁,递归互斥锁,未来/承诺设计模式实现等。
答案 2 :(得分:28)
std::thread
提供跨Windows,MacOS和Linux等不同平台的可移植性。
正如@hirshhornsalz在下面的评论和相关答案https://stackoverflow.com/a/13135425/1158895中提到的那样,std::thread
可能尚未在所有平台上完成。即便如此,(它将在不久的将来)它应该优于pthread
,因为它应该使你的应用程序更具有前瞻性。
答案 3 :(得分:6)
对我而言,决定性的技术差异是std中缺少信号处理原语而不是pthreads。单独使用std无法在Unix进程中正确地指示信号处理是AFAIK使用std :: thread的一个令人衰弱的缺陷,因为它禁止设置真正的多线程信号处理模式来处理专用的所有信号线程并阻止它们在其余部分。你被迫假设std :: thread是使用pthreads实现的,并希望在使用pthread_sigmask时最好。正确处理信号在企业的Unix系统编程中是不可协商的。
截至2016年,std :: thread是一个玩具;就这么简单。
答案 4 :(得分:1)
OpenMP
是一种基于SMP的标准化多线程标准 已经在Linux和Windows上工作了十多年了。默认情况下,OpenMP可用于所有编译器,包括GCC和Microsoft Visual Studio。
使用OpenMP时要注意的一点是,如果线程数多于CPU核心数,那么由于与上下文切换相关的开销,性能会下降。要记住的第二件事是,实际的操作系统级别线程的初始化相对昂贵。初始化只是一小部分,但在某些应用中,非常小的分数累积到a 可观的费用。
对于与软件体系结构要求相关的并发性您可能希望搜索“轻量级线程”或“绿色线程”的某些实现,而不是使用OpenMP。区别在于OpenMP线程是实际的,操作系统级别的线程,但“绿色线程”可以只是通过使用少量真实线程执行的“模拟线程”。