回答:
-pthread
コンパイラーにpthreadライブラリーでリンクするように指示するとともに、スレッドのコンパイルを構成します。
たとえば、次の例は-pthread
、UbuntuマシンにインストールされているGCCパッケージでオプションが使用されるときに定義されるマクロを示しています。
$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1
この-lpthread
オプションを使用しても、pthreadライブラリがリンクされるだけです。事前定義されたマクロは定義されません。
結論:-pthread
オプションを使用する必要があります。
注:-pthread
オプションはGCCドキュメントにプラットフォーム固有のオプションとして記載されているため、常に利用できるとは限りません。ただし、GCCのドキュメントに明示的にリストされていないプラットフォーム(i386やx86-64など)では利用できます。利用可能な場合は使用してください。
-pthreads
(-pthread
Solaris 2の同義語としてリストされている)や-mthread
(i386およびx86-64 WindowsでのMinGW固有のスレッドサポートの)など、他の同様のオプションがGCCによって使用されていることにも注意してください。私の理解では、GCCは-pthread
今後一律の使用に移行しようとしているということです。
-lpthread
、POSIXスレッドライブラリ全体を取得するには、パスするだけで十分です。
-lpthread
は、POSIXスレッドライブラリ全体を取得します。
-lpthread
pthreadを完全にサポートするには、とのリンクで十分であると述べています。他のコンパイルフラグは必要ありません。
-lpthread
はありませんが-pthread
、私はすでに私の以前のコメントで明らかなように、pthreadのサポートを得るには不十分です。
-lpthread
。ただし、gccのドキュメントでは、これはpthreadのサポートを得るには不十分である可能性があることを示唆しています。あなたが提供しなかっ-lpthread
たり、ランダムな他のプロプライエタリなオプションを提供しなかった場合に何が起こるかについて私はまったく気にしません。-lpthread
pthreadを保証するためにPOSIXでのみ指定されており、gccでは十分ではないようです。
-pthread
pthreadsライブラリを使用したマルチスレッドのサポートを追加します。このオプションは、プリプロセッサとリンカーの両方にフラグを設定します(man gcc
)。
ながら
-lpthread
リンク中に存在し、前処理中に影響はありません。
受け入れられた答えはありますが、IMO、それは十分なコンテキストと洞察を提供していません。したがって、この余分な答え。
-lpthread
存在しない問題の解決策です(〜2005以降)。
昔は、LinuxThreadsのように、POSIXに準拠していないPthreads APIの独自の実装がありました。POSIX標準では、POSIX準拠の動作が必要な場合は、とリンクする必要があり、Pthreads APIのPOSIX準拠の実装をリンクするために必要なリンクは、実装が多数ある場合にのみ記載されています。-lpthread
最新のオペレーティングシステムでは、Pthreads APIの複数の実装はありません。そしてそれが-lpthread
もはや目的を果たさない理由です。
以下のようなコンパイラgcc
とclang
(と、おそらく、すべてのLinux互換のコンパイラ)が必要と使用-pthread
の両方のコンパイルとリンクPOSIX準拠のマルチスレッドアプリケーションを、その1が使用しなければならないものですためのコマンドラインオプションを。
コンパイル時に、-pthread
オプションはPthread APIが要求され(Solarisスレッドなどの複数のスレッドAPIが存在する可能性がある)ことを明示し、プラットフォーム固有のマクロ(_REENTRANT
Linuxでは_MT
Solaris)を定義します。
リンク時に、-pthread
POSIX準拠のPthreads API動作を実装する必要なライブラリ(存在する場合)内のリンク。
上記により、なぜ-lpthread
必要でも十分でもない理由が明らかになります。