这篇文章底部的代码编译得很好但是用
生成了一个无用的二进制文件$ clang++ -v
clang version 3.3 (trunk 168461)
Target: x86_64-unknown-linux-gnu
Thread model: posix
发出此命令时
clang++ -std=c++11 -pthread -s -O3 -DNDEBUG source.cpp -o source
二进制文件总是生成此
terminate called after throwing an instance of 'std::system_error'
what(): Operation not permitted
Aborted (core dumped)
我得不到的是:
-std=c++11
还不够?-pthread
或不支持,根据我所读的它应该支持pthreads 感谢。
#include <iostream>
#include <thread>
void f()
{
std::cout << "Hello World\n";
}
int main()
{
std::thread t(f);
t.join();
}
答案 0 :(得分:1)
你应该使用这样的命令:
clang ++ -std = c ++ 11 -pthread -stdlib = libstdc ++ threadEx.cpp
您忘记添加图书馆了。 使用ubuntu 12.04,clang3.3,libc ++对我不起作用 但我使用clang3.3和g ++ 4.7.2(g ++ 4.6.3也不起作用)。两者都有效。
答案 1 :(得分:0)
在thread.cc中,thread :: _ M_start_thread()中有以下代码:
if (!__gthread_active_p())
__throw_system_error(int(errc::operation_not_permitted));
这就是为什么它为你炸毁--- libgcc检查pthread_cancel()的存在,如果它存在则只返回1。你没有指定-pthread,所以没有pthread_cancel()。
为什么在构建时需要指定-pthread?我猜它是因为替代方案是假设-pthread一直都会导致不必要的开销。
答案 2 :(得分:0)
使用-pthread
标志在编译代码时会产生很大的不同,请参阅gcc - significance of -pthread flag when compiling。
根据问题What is g++'s -pthread equiv in clang?的接受答案,clang支持 -pthread
。
实际上,您发布的这一行告诉您正在使用pthreads:
Thread model: posix
Pthreads won't go away,我非常怀疑Clang / LLVM将从头开始实现一个新的线程库。他们为什么?该平台的本地库已经足够成熟。
抱歉,我对此无法帮助您:我的机器上没有安装clang,并且您的代码在我的机器上使用gcc 4.6运行得很好。