为什么在GCC和Clang中使用std :: thread需要-pthread?

时间:2015-11-13 16:11:18

标签: multithreading c++11 gcc clang

为什么在编译直接或间接使用-std=c++11的程序时指定std::thread并不意味着-pthread?使用pthreads的std::thread的实现细节暴露给程序员似乎很奇怪;如果它是给用户选择posix兼容的线程库的问题,为什么不默认为pthreads并有一些--threading-model=<your_favorite_posix_threads_library>参数来覆盖它?

1 个答案:

答案 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系统上的传统包袱,其中许多都是在没有线程支持的情况下启动的,然后在获得完全内核支持之前经历了一个用户空间线程阶段。我想它仍然存在,因为没有人喜欢做出重大改变。