C + + 11 std: : 线程 vs posix 线程

我为什么要在实践中选择这样或那样? 除了 std::thread是一个类之外,还有什么技术差异?

113213 次浏览

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

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

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

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

如果您想在许多平台上运行代码,那么可以使用 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仍然没有实现。

对我来说,决定性的技术区别在于,在 std 中没有信号处理原语,而在 pthread 中则没有。在 Unix 进程中,单独使用标准进程无法正确指定信号处理,这是 AFAIK 在使用标准: : 线程时的一个致命缺陷,因为它阻止一个线程建立真正的多线程信号处理模式,以便在一个专用线程中处理所有信号,并在其余线程中阻塞它们。您必须假设 std: : thread 是使用 pthread 实现的,并且希望在使用 pthread _ sigask 时能达到最好的效果。在企业的 Unix 系统编程中,正确处理信号是不容商量的。

截至2016年,标准: : 线程是一个玩具; 就这么简单。