Linux(カーネル2.6.5)では、ビルドシステムは-D_REENTRANT
を使用してgccを呼び出します。
pthreads
を使用する場合でも、これは必要ですか?
gcc -pthread
オプションとどのように関連していますか? pthreadで-pthread
を使用する必要があることを理解していますが、-D_REENTRANT
は必要ですか?
余談ですが、gcc 3.3.3とgcc 4.x.xの間でのREENTRANTの使用について、あなたが知っている違いはありますか?
-pthread
gccオプションを使用すると、_REENTRANT
が定義されていることがわかります。コマンドラインから-D_REENTRANT
を省略しても違いはありますか。たとえば、一部のオブジェクトがマルチスレッドサポートなしでコンパイルされ、pthreadを使用するバイナリにリンクされて問題が発生する可能性がありますか?
使用するだけで問題ないはずです:g++ -pthread
> echo | g++ -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1
静的ライブラリとリンクする複数の静的ライブラリとアプリケーションをコンパイルしています。ライブラリとアプリケーションの両方がpthreadを使用しています。
過去のある段階で必要だったと思いますが、まだ必要かどうか知りたいです。 Googlingは、pthreads
を含む-D_REENTRANT
に関する最近の情報を返していません。 kernel/gcc/pthreadの最近のバージョンでの使用について説明しているリンクまたは参照を教えていただけますか?
明確化:-D_REENTRANTと-lpthreadを使用している現在、プリプロセッサとリンカーの両方のフラグを設定するman gccを見て、それらをg ++ -pthreadだけで置き換えることができると思います。何かご意見は?
私にとって最良の答えは、pts
からのコメントでした。
あなたは適切に調査し、あなた自身の質問に答えました。
g++ -pthread
を使用します。これはg++ -lpthread -D_REENTRANT
と同等です。g++ -D_REENTRANT
の使用方法は異なり、すべてのリンカーフラグが設定されない場合があります。 – 5月18日0:30
Gcc情報ページから:
`-pthread'
Adds support for multithreading with the "pthreads" library. This
option sets flags for both the preprocessor and linker.
したがって、-pthreadフラグだけで十分です。ただし、一部のコードに渡すことはお勧めしません。
Chrisがコメントで示唆したように、Linuxでgcc -dumpspecsを使用すると、実際にプリプロセッサフラグも設定されることが確認されます。
%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
gccの-pthreadsフラグは、現在使用しているプラットフォームでのpthreadのサポートに必要な関連するコンパイラーおよびリンカーフラグを設定します。
そうです、Linux x86(およびおそらく他の多くのプラットフォーム)では、これは「-D_REENTRANT -lpthread」と同等ですが、すべてのプラットフォームに当てはまるわけではありません。
(少なくともしばらくの間、aixでは、-pthreadが原因でg ++が完全に異なるlibstdc ++。aにリンクしていましたが、それでもまだそうであるかどうかはわかりません...)