为什么在编译直接或间接使用-std=c++11
的程序时指定std::thread
并不意味着-pthread
?使用pthreads的std::thread
的实现细节暴露给程序员似乎很奇怪;如果它是给用户选择posix兼容的线程库的问题,为什么不默认为pthreads并有一些--threading-model=<your_favorite_posix_threads_library>
参数来覆盖它?
答案 0 :(得分:4)
使用-pthread
并非普遍需要std::thread
选项 - 这是您正在构建的任何平台的实现怪癖。
编译:
#include <thread>
#include <iostream>
int main()
{
std::thread t{[]()
{
std::cout << "Hello World\n";
}};
t.join();
return 0;
}
带
clang -std=c++11 ThreadTest.cpp -lc++
在MacOSX上,构建并运行,如果我们这样做:
otool -L a.out
a.out:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.0.0)
我们可以看到,我们需要连接任何额外的东西才能使这项工作 - 它也不会发生在幕后。它似乎是一个非常多的平台实现细节,pthreads是一个单独的库。
选择带有pthread接口的线程库是* NIX系统上的传统包袱,其中许多都是在没有线程支持的情况下启动的,然后在获得完全内核支持之前经历了一个用户空间线程阶段。我想它仍然存在,因为没有人喜欢做出重大改变。