40

Linux (カーネル 2.6.5) では、ビルド システムは gcc を-D_REENTRANT.

を使用する場合、これはまだ必要pthreadsですか?

gcc -pthreadオプションとの関係は?pthreads で使用する必要があることは理解しています-pthreadが、それでも必要-D_REENTRANTですか?

余談ですが、 gcc 3.3.3 と gcc 4.xx の間で REENTRANT を使用する際に知っている違いはありますか?

gcc オプションを使用すると、それが定義され-pthreadていることがわかります。_REENTRANTコマンドラインを省略-D_REENTRANTしても違いはありますか? たとえば、一部のオブジェクトがマルチスレッドのサポートなしでコンパイルされ、pthreads を使用するバイナリにリンクされて問題が発生する可能性がありますか?

使用するだけで問題ないと思います: g++ -pthread

> echo | g++          -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1

静的ライブラリとリンクする複数の静的ライブラリとアプリケーションをコンパイルしています。ライブラリとアプリケーションの両方が pthread を使用します。

過去のある段階で必要だったと思いますが、まだ必要かどうかを知りたいです。グーグルで言及した最近の情報は返されていません - D_REENTRANTwith pthreads. kernel/gcc/pthreadの最近のバージョンでの使用について議論しているリンクまたは参考文献を教えていただけますか?

明確化: 現在、-D_REENTRANT と -lpthread を使用していますが、g++ -pthread だけで置き換えることができると思います。man gcc を見ると、プリプロセッサとリンカの両方のフラグが設定されています。何かご意見は?

4

3 に答える 3

18

私にとって最良の答えは、pts彼がわざわざ回答として提出した場合のコメントでした:

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

于 2009-05-21T01:28:25.083 に答える
7

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}
于 2009-05-18T02:18:32.930 に答える
5

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

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

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

于 2009-05-18T02:42:45.553 に答える