2

这篇文章底部的代码编译得很好,但会生成一个无用的二进制文件

$ 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)

我不明白的是:

  • 如果 C++11 在标准中包含线程模型,为什么我需要链接 POSIX 线程库,为什么标志-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();
}
4

3 回答 3

1

你应该使用这样的命令:

clang++ -std=c++11 -pthread -stdlib=libstdc++ threadEx.cpp

您忘记添加库。libc++ 不适用于 ubuntu 12.04、clang3.3,但我使它适用于 clang3.3 和 g++ 4.7.2(g++ 4.6.3 也不起作用)。两者都有效。

于 2013-06-24T08:54:12.983 回答
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 ,这会导致不必要的开销。

于 2012-11-23T08:58:38.760 回答
0

在编译代码时使用该-pthread标志会产生巨大的差异,请参阅gcc - 在编译时 -pthread 标志的意义

根据对该问题的公认答案What is g++'s -pthread equiv in clang? ,铿锵声支持-pthread


实际上,您发布的这一行表明您正在使用 pthreads:

Thread model: posix

Pthreads 不会消失,我非常怀疑 Clang / LLVM 是否会从头开始实现一个新的线程库。他们为什么会?该平台的原生库已经足够成熟。


抱歉,我无法为您提供更多帮助:我的机器上没有安装 clang,并且您的代码在我的带有 gcc 4.6 的机器上运行良好。

于 2012-11-23T09:10:53.557 回答