为什么在编译直接或间接使用的程序时指定-std=c++11
std::thread
并不意味着-pthread
?使用引擎盖下的pthreads的std::thread
的实现细节暴露给程序员似乎很奇怪;如果要让用户选择posix兼容线程库,为什么不只是默认pthreads并且有一些参数可以覆盖它呢?为什么-pthread在GCC和Clang中使用std :: thread是必需的?
6
A
回答
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系统上的传统包装,其中许多是在没有线程支持的情况下启动的,然后在完全内核支持之前经历了用户空间线程阶段。我想它仍然存在,因为没有人喜欢做出突破性的改变。
相关问题
- 1. g ++ - 为什么我必须在使用std :: thread时传递“-pthread”选项?
- 2. 在clang中g ++的-pthread equiv是什么?
- 3. 为什么clang需要-lm不像gcc?
- 4. 为什么使用std :: thread :: hardware_concurrency()和boost :: thread :: hardware_concurrency()会有区别?
- 5. 'thread'不是GCC的'std'的成员4.8
- 6. 是否可以在gcc编译器中使用clang std库?
- 7. 从std :: thread转到相关的pthread
- 8. gcc参数:-pthread。它有什么作用?
- 9. 为什么需要Thread .__ init __()在Class中?
- 10. GCC的行为与std :: async(std :: launch :: async)与Clang的行为
- 11. 为什么gcc在std :: uninitialized_copy中使用memmove?
- 12. 在std :: thread中使用std :: move
- 13. 为什么在使用clang -std = gnu ++ 11时编译C++代码?
- 14. std :: back_inserter在旧的GCC上需要const_reference。为什么?
- 15. 在GCC中,std :: list的size()方法是O(n)。为什么?
- 16. 为什么使用gcc和std = c99编译时找不到getaddrinfo
- 17. 为什么GCC和MSVC std :: normal_distribution是不同的?
- 18. 在命名空间中找不到GCC std :: thread std
- 19. Thread_Guard类中std :: thread引用的默认值是什么
- 20. 使用std :: thread与std :: mutex
- 21. PThread vs boost :: thread?
- 22. GCC和Clang上的链接错误:什么是'__tls_get_addr @@ GLIBC_2.3'
- 23. 为什么std :: thread函数是由右值运行的?
- 24. MinGW和std :: thread
- 25. 为什么std :: thread在其构造函数中等待?
- 26. Boost中的pthread是什么?
- 27. 为什么COW std :: string优化在GCC 5.1中仍然可用?
- 28. 如何使用多个GCC-LLVM和clang
- 29. 为什么使用clang和gcc,当你想使用`int32_t`或`memcpy`时你的include是不同的?
- 30. 为什么浮标是必需的?
如果您将“GCC for C++”视为“'g ++ -pthread -std = C++ 11”,它会帮助您吗?不用担心定义中的词汇噪音? –
@KerrekSB当使用CMake并且实际尝试跨平台而不诉诸明确修改CMAKE_CXX_FLAGS(微软的编译器抱怨未知标志但忽略它们)或者放置平台/'find_library'条件时,它使它变得很痛苦,特别是如果行为最终会改变。我发现一个邮件列表建议使用'find_package(Threads)',但这似乎不适用于GCC或Clang。我并不是在寻找解决方案,因为我已经知道该怎么做了,我只是想知道他们为什么这么做。它只是向后兼容? – JAB
我认为没有理由。没有人关心改变行为,这是从C++ 11之前的编译器继承而来的。 – SergeyA