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

Multithreading 为什么在GCC和Clang中使用std::thread需要-pthread?,multithreading,c++11,gcc,clang,Multithreading,C++11,Gcc,Clang,为什么在编译直接或间接使用std::thread的程序时指定-std=c++11并不意味着-pthread?奇怪的是,在后台使用pthreads的std::thread的实现细节暴露给了程序员;如果是让用户选择与posix兼容的线程库,为什么不默认使用pthreads并使用一些--threading model=参数来覆盖它呢?使用std::thread并不是普遍需要的-pthread选项,这是您构建的任何平台的一个实现怪癖 汇编: #包括 #包括 int main() { std::线程t{[

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

使用
std::thread
并不是普遍需要的
-pthread
选项,这是您构建的任何平台的一个实现怪癖

汇编:

#包括
#包括
int main()
{
std::线程t{[]()
{

std::如果您将“GCC for C++”视为“
g++-pthread-std=C++11
”,并且不担心定义中的词法干扰,这会对您有所帮助吗?@KerrekSB在使用CMake时,以及在不显式修改CMake_CXX_标志的情况下尝试跨平台时,这会让您感到痛苦(微软的编译器确实抱怨未知的标志,但忽略了它们)或放置平台/
find_库
条件,尤其是当行为最终发生变化时。我发现的一个邮件列表建议使用
find_包(线程)
,但这似乎不适用于GCC或Clang。我不是在寻找解决方案,因为我已经知道该怎么做了,我只是想找出它们为什么会这样做。这只是向后兼容吗?我认为没有理由。没有人太在意改变这种行为,它是从C++11之前的编译器继承下来的。(实际上,我刚刚得到了
find_-package(Threads)
工作正常,使我之前的评论无效,但不管怎样。)@marglisse这似乎是设计上的一个失败。如果程序员知道只有一个线程会使用线程不安全的函数,那么会发生什么呢?“我想它仍然存在,因为没有人喜欢做出突破性的改变"但是,由于您必须更改代码以使用std::thread,我不知道如果以这种方式定义它,并假定没有指定任何其他内容,lpthread将破坏任何东西?我所指的更改是需要在某些平台上使用线程的任何程序中包含libpthread。符合C++11的工具和库非常大ILE向后兼容C++ 03代码库。一个真的需要知道为什么pToX仍然被分解成一个单独的库。这很有趣。好奇的是,如果用Clang构建但不指定代码> -LC++<代码>,那么C++库在OSX上使用什么?如果链接不成功,除非我使用<代码> CLAN++/COD>作为编译器驱动程序。Clang +L带有
/usr/lib/libc++.1.dylib
/usr/lib/libSystem.B.dylib
的墨水。
clang -std=c++11 ThreadTest.cpp -lc++
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)