为什么我在实践中应该选择其中之一? 除了
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
非常相似(实际上它来自同一作者)并且工作可靠,但是,当然,它引入了来自第三方库的另一个依赖项。
std::thread
主要适用于原生 Android。有些类,如
std::timed_mutex
仍未实现。
std::thread
库是在支持 pthreads 的环境中在 pthreads 之上实现的(例如:libstdc++)。我认为两者之间最大的区别在于抽象。
std::thread
是一个C++类库。
std::thread
库包含许多抽象功能,例如:作用域锁、递归互斥体、未来/承诺设计模式实现等等。
std::thread
提供跨不同平台(如 Windows、MacOS 和 Linux)的可移植性。正如 @hirshhornsalz 在下面的评论和相关答案中提到的
https://stackoverflow.com/a/13135425/1158895,std::thread
可能尚未在所有平台上完成。即便如此,(这将是在不久的将来)它应该比
pthread
更受青睐,因为它应该使您的应用程序更加面向未来。
截至 2016 年,std::thread 还只是一个玩具;就这么简单。
std::thread
对 POSIX 线程没有的线程数量施加了限制。看来 C++ 中的线程创建会检查名为
systemd
的
DefaultTasksMax
属性,而 Posix
libpthread
不会检查该属性。我很快就会用 C++ 和 C 中的片段更新这个答案,这些片段似乎证明了这一点。