Answers:
如果要在许多平台上运行代码,请使用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
,仍未实现。
std::thread
它的raii样式也不错,因为它可以处理C ++异常,而pthread不能开箱即用。
std::thread
提供跨Windows,MacOS和Linux等不同平台的可移植性。
如@hirshhornsalz在下面的评论中以及相关答案https://stackoverflow.com/a/13135425/1158895中提到的,std::thread
可能并非在所有平台上都完整。即便如此(在不久的将来),它也应该比的更受青睐,pthread
因为它可以使您的应用程序更加适应未来。
boost::thread
在Win64或Bionic(Android)上使用,因为std::thread
它仍然缺少很大的部分,而在Linux上std::thread
似乎已经很成熟了。
对我而言,决定性的技术差异是与pthread相反,std中没有信号处理原语。仅使用std无法在Unix进程中正确指示信号处理是AFAIK使用std :: thread的一个令人衰弱的缺陷,因为它阻止了建立真正的多线程信号处理模式来处理专用信号中的所有信号。线程并将其阻止在其余部分。您必须假定std :: thread是使用pthreads实现的,并希望在使用pthread_sigmask时获得最佳效果。在企业的Unix系统编程中,正确处理信号是不可协商的。
截至2016年,std :: thread是一个玩具; 就那么简单。
std::thread
带来了pthread所没有的类型安全性。
OpenMP的
是基于SMP的标准化多线程标准,已经在Linux和Windows上运行了十多年。默认情况下,OpenMP可用于所有编译器,包括GCC和Microsoft Visual Studio。
使用OpenMP时需要注意的一件事是,如果线程多于CPU内核,则性能会因上下文切换相关的开销而下降。要记住的第二件事是,实际的操作系统级别线程的初始化相对昂贵。初始化只需几分之一秒,但是在某些应用程序中,非常小的分数会累积起来,从而产生相当大的开销。
对于与并发相关的软件体系结构要求,您可能需要搜索一些“轻量级线程”或“绿色线程”的实现,而不是使用OpenMP。区别在于OpenMP线程是实际的,操作系统级别的线程,但“绿色线程”可以只是通过使用少量实际线程执行的“模拟线程”。
std::async