web-dev-qa-db-ja.com

-pthreadsで-D_REENTRANTが必要ですか?

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だけで置き換えることができると思います。何かご意見は?

39
stefanB

私にとって最良の答えは、ptsからのコメントでした。

あなたは適切に調査し、あなた自身の質問に答えました。 g++ -pthreadを使用します。これはg++ -lpthread -D_REENTRANTと同等です。 g++ -D_REENTRANTの使用方法は異なり、すべてのリンカーフラグが設定されない場合があります。 – 5月18日0:30

18
stefanB

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}
7
bdonlan

gccの-pthreadsフラグは、現在使用しているプラ​​ットフォームでのpthreadのサポートに必要な関連するコンパイラーおよびリンカーフラグを設定します。

そうです、Linux x86(およびおそらく他の多くのプラットフォーム)では、これは「-D_REENTRANT -lpthread」と同等ですが、すべてのプラットフォームに当てはまるわけではありません。

(少なくともしばらくの間、aixでは、-pthreadが原因でg ++が完全に異なるlibstdc ++。aにリンクしていましたが、それでもまだそうであるかどうかはわかりません...)

5
Stobor