14

私は自分の手g++ 4.6C++11機能を試しているだけです。フラグを使用して単純なスレッデッドコードをコンパイルするたびに-std=c++0x、セグメンテーション違反でクラッシュするか、奇妙な例外がスローされます。

スレッドに関連するいくつかの質問を読みましたが、コードを正しくコンパイルするにはフラグC++11も使用する必要があることに気付きました。-pthread使用-pthreadは正常に機能し、スレッドコードを実行することができました。

私の質問は、C++11マルチスレッドモデルPthreadsがバックグラウンドで使用するかどうかです。それともゼロから書かれていますか?

メンバーの誰かが貢献者であるかどうかはわかりませんがgcc、私はただ興味があります。

4

3 に答える 3

23

実行g++ -vすると、構成方法に関する一連の情報が得られます。それらの1つは、通常、次のような行になります。

Thread model: posix

-pthreadこれは、スレッドライブラリ(libstdc++のstd:: thread)にpthreadを使用するように構成されていることを意味し、システム( Linux)のpthreadに必要なフラグも使用する必要があることを意味します。

これは標準とは特に関係がなく、g++による標準の実装方法の詳細にすぎません。

于 2012-08-02T19:15:08.053 に答える
9

C ++は、スレッドの実装方法を指定していません。実際には、C ++スレッドは通常、既存のシステムスレッドライブラリ(pthreadやwindowsスレッドなど)の薄いラッパーとして実装されます。std :: thread :: native_handle()を使用して、基になるスレッドオブジェクトにアクセスするためのプロビジョニングもあります。

于 2012-08-02T19:16:02.417 に答える
2

-pthreadsクラッシュする理由は、またはを指定しない場合-lpthreads、からの弱く定義された多数のpthreadスタブ関数libcがリンクされるためです。これらのスタブ関数は、プログラムをエラーなしでリンクさせるのに十分です。ただし、実際にpthreadを作成するには、libpthread.aライブラリが完全に必要であり、ダイナミックリンカ(dl)がこれらの欠落している関数を解決しようとすると、セグメンテーション違反が発生します。

于 2014-09-12T23:05:42.530 に答える