Clang ++ 3.3 for C ++ 11中的线程支持

时间:2012-11-23 08:34:46

标签: c++ multithreading c++11 pthreads clang

这篇文章底部的代码编译得很好但是用

生成了一个无用的二进制文件
$ 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)

我得不到的是:

  • 为什么我需要链接POSIX线程库,如果C ++ 11在标准中包含一个线程模型,为什么标志-std=c++11还不够?
  • 如果clang ++支持-pthread或不支持,根据我所读的它应该支持pthreads

感谢。


#include <iostream>
#include <thread>

void f()
{
  std::cout << "Hello World\n";
}

int main()
{
  std::thread t(f);
  t.join();
}

3 个答案:

答案 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运行得很好。