C++ Clang+中的线程支持+;3.3对于C++;11

C++ Clang+中的线程支持+;3.3对于C++;11,c++,multithreading,c++11,pthreads,clang,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 throwi

这篇文章底部的代码编译得很好,但生成了一个无用的二进制代码,其中包含

$ 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
    ,根据我所读的内容,它应该支持pthread
谢谢


#包括
#包括
void f()
{

std::cout在thread.cc中,线程中有以下代码位::\M\u start\u thread()

这就是为什么它会为您而爆炸---libgcc检查pthread_cancel()是否存在,如果存在,则只返回1。您没有指定-pthread,因此没有pthread_cancel()


为什么在构建时需要指定-pthread?我猜这是因为替代方法是始终假定-pthread,这会导致不必要的开销。

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

根据公认的问题答案,clang支持
-pthread


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

Thread model: posix
,我非常怀疑Clang/LLVM是否会从头开始实现一个新的线程库。为什么呢?平台的本机库已经足够成熟了



很抱歉,我无法在这方面进一步帮助您:我的计算机上没有安装clang,您的代码在使用gcc 4.6的计算机上运行良好。

您应该使用如下命令:

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也不起作用)。这两种方法都有效。

开销?为什么?我在声明我要导入的内容,包括它是标准命名约定的一部分,解析器它不够聪明,无法汇总我的程序所需的所有库?而且这个答案也不能说服我,因为每个编译器都应该有自己的标准库实现和U是在谈论GCC,而不是CLAN/LLVM。我最好的猜测是LLVM C++没有准备好,它与GNU一个不兼容。解析器不决定在最终的二进制中包含哪些库,不。这可能会以实现者和用户的眼泪结束。我在讨论LBGCC,它是一个具有SURAA的库。d支持底层libstdc++。默认情况下,clang将链接到libgcc和libstdc++(ldd您的程序),但只有在指定-pthread时,它才会链接到libpthread。您已尝试使用clang++3.3编译此文件并在您的计算机上运行它?(如果您有linux)不,对不起,我的机器上没有安装clang。该页面上的答案在这里也不适用,因为我有一个从svn生成的版本,它只有1-2天,这不可能是一个旧版本…它是关于C++11的,以前你实际上被迫使用pthreads,现在线程应该是标准库的一部分。这就是它也应该提供它自己的新的C++标准库的实现,它是C++ 11的一个最简单的方法。好,我已经更新了我的答案。你正在使用pTrx。我认为你的两个问题都是回答的。在使用CLAN时,你应该使用LBC+++作为标准库。只需在你的编译中添加<代码> -STDLIB = LIbc++ +代码>。er args.@bamboon是的,我已经让他试过了。如果你使用的是libstdc++(不是libc++),您是否尝试将
-D\u GCC\u have\u SYNC\u COMPARE\u AND\u SWAP\u 1-D\u GCC\u have\u SYNC\u COMPARE\u AND\u SWAP\u 2-D\u GCC\u have\u SYNC\u COMPARE\u AND\u SWAP\u 4-D\u GCC\u have\u SYNC\u COMPARE\u AND\u SWAP\u 8
添加到命令行?检查是否改善了这种情况。背景信息。
if (!__gthread_active_p())
  __throw_system_error(int(errc::operation_not_permitted));
Thread model: posix