2015-11-13 140 views
6

为什么在编译直接或间接使用的程序时指定-std=c++11std::thread并不意味着-pthread?使用引擎盖下的pthreads的std::thread的实现细节暴露给程序员似乎很奇怪;如果要让用户选择posix兼容线程库,为什么不只是默认pthreads并且有一些参数可以覆盖它呢?为什么-pthread在GCC和Clang中使用std :: thread是必需的?

+2

如果您将“GCC for C++”视为“'g ++ -pthread -std = C++ 11”,它会帮助您吗?不用担心定义中的词汇噪音? –

+1

@KerrekSB当使用CMake并且实际尝试跨平台而不诉诸明确修改CMAKE_CXX_FLAGS(微软的编译器抱怨未知标志但忽略它们)或者放置平台/'find_library'条件时,它使它变得很痛苦,特别是如果行为最终会改变。我发现一个邮件列表建议使用'find_package(Threads)',但这似乎不适用于GCC或Clang。我并不是在寻找解决方案,因为我已经知道该怎么做了,我只是想知道他们为什么这么做。它只是向后兼容? – JAB

+0

我认为没有理由。没有人关心改变行为,这是从C++ 11之前的编译器继承而来的。 – SergeyA

回答

2

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

+0

“我想它仍然存在,因为没有人喜欢做出突破性的改变”,但是因为你必须改变代码来使用std :: thread,我没有看到如何定义它,以这种方式假定lpthread,如果没有其他指定会打破任何东西? – Voo

+1

我所指的更改是需要在任何使用某些平台上的线程的程序中包含libpthread。与C++ 11兼容的工具和库在很大程度上向后兼容C++ 03代码库。 一个真的不得不想知道为什么pthreads仍然被分解到一个单独的库。 – marko

+1

那很有趣。出于好奇,如果你使用Clang构建但是没有指定'-lC++',那么在OSX上使用什么C++库? – JAB

相关问题