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 フラグの意味 を参照してください。

質問に対する受け入れられた回答によると、clang の g++ の -pthread equiv は何ですか? 、clang をサポートします-pthread


実際、投稿したこの行は、pthreads を使用していることを示しています。

Thread model: posix

Pthreads はなくならないでしょうし、Clang / LLVM が新しいスレッド化ライブラリをゼロから実装するかどうかは非常に疑わしいです。なぜ彼らは?プラットフォームのネイティブ ライブラリは十分に成熟しています。


申し訳ありませんが、これ以上これ以上お手伝いすることはできません。私のマシンには clang がインストールされていません。あなたのコードは、gcc 4.6 を搭載した私のマシンで問題なく動作します。

于 2012-11-23T09:10:53.557 に答える