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

JAB*_*JAB 7 multithreading gcc clang c++11

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

mar*_*rko 5

-pthread选项并非普遍需要使用std::thread- 它是您正在构建的任何平台的实现怪癖。

编译:

#include <thread>
#include <iostream>

int main()
{
    std::thread t{[]()
        {
            std::cout << "Hello World\n";
        }};
    t.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

clang -std=c++11 ThreadTest.cpp -lc++
Run Code Online (Sandbox Code Playgroud)

在 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)
Run Code Online (Sandbox Code Playgroud)

我们可以看到,我们不需要任何额外的链接来完成这项工作——这也没有发生在幕后。pthreads 是一个单独的库,这似乎是一个平台实现细节。

选择带有 pthread 接口的线程库是 *NIX 系统上的遗留问题,其中许多系统开始时没有线程支持,然后在获得完整内核支持之前经历了用户空间线程阶段。我想它仍然存在,因为没有人喜欢做出重大改变。

  • 链接失败。除非我使用 `clang++` 作为编译器驱动程序。Clang++ 与 `/usr/lib/libc++.1.dylib` 和 `/usr/lib/libSystem.B.dylib` 链接。 (3认同)