コンパイル時の-pthreadフラグの重要性


143

さまざまなマルチスレッドのCおよびC ++プロジェクトで-pthread、コンパイルステージとリンクステージの両方にフラグが適用されるのを見ましたが、他の人はまったく使用せず-lpthread、リンクステージに渡しています。

-pthreadフラグを使用してコンパイルおよびリンクしないという危険はあり-pthreadますか?つまり、実際には何をしますか?私は主にLinuxプラットフォームに興味があります。

回答:


107

試してください:

gcc -dumpspecs | grep pthread

で始まるものを探します%{pthread:

私のコンピュータでは、これによりファイルがでコンパイルされ-D_REENTRANT、でリンクされ-lpthreadます。他のプラットフォームでは、これは異なる場合があります。-pthreadほとんどの移植性に使用します。

_REENTRANTGNU libcでを使用すると、一部のlibcヘッダーの動作が変わります。具体的な例として、errnoスレッドローカルな場所を返す関数を呼び出します。


3
errno一般的に前処理だけではないかもしれません。記事hpl.hp.com/techreports/2004/HPL-2004-209.pdfが実際にgcc最適化にどの程度関連しているかはわかりませんが、そこでのレビューの深さに感銘を受けました。
Pascal Cuoq、2010年

2
私はerrnoの例が正しいとは思いません。-pthreadフラグまたは_REENTRANT定義がなくても、私のerrno.h(glibc 2.10.1)およびgcc(amd64の4.4.1)は、errno処理の動的呼び出しを生成し、シンボルアドレスにリンクしません。
アンディロス

1
@Pascal:リンクをありがとう。現時点では少し頭上にありますが、中心的なポイントは、スレッドを単に「タックオン」することはできず、メモリモデルの一部として設計する必要があるということです。私はそれに完全に同意します。
Chris Jester-Young

2
@Andy-gccのバージョンは、提供するために、-D_REENTRANTまたは-pthread自動的に構築される場合があります。でビルドを実行するとg++ -v、コンパイラのフロントエンドが実際にcc1plusとに渡すパラメーターに関する多くの出力がダンプされldます。
Tom

3
ここでまだ回答されていない質問があります:-pthreadフラグを使用してコンパイルおよびリンクしない危険性はありますか?つまり、-pthreadは実際には何をしますか?
natenho 2015

40

からman gcc

-pthread pthreadsライブラリを使用したマルチスレッドのサポートを追加します。このオプションは、プリプロセッサーとリンカーの両方にフラグを設定します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.