7

errno をスレッドセーフにするために、コンパイル時に _REENTRANT マクロを追加する必要がありますか?

いいえの場合、gcc / linux / solaris のすべてのバージョンに当てはまりますか、それとも特定の古いバージョンに必要ですか?

最近、_REENTRANT が使用されていないコードをテストしたところ、マルチスレッド環境で未定義の fahsion で動作する errno が見つかりましたか? しかし、_REENTRANT を追加した後、すべてが正常に機能していました。環境はSolarisでした。

しかし、ここでの議論は、_REENTRANT を追加することが必須であるとは言っていないようです。私は少し混乱しています。

また、_REENTRANT とは別に、他のオプションやライブラリを追加して、アプリケーションにスレッド セーフなエラー番号が含まれるようにする必要がありますか?

4

2 に答える 2

11

実際に_REENTRANTは、スレッドが既存の実装に加えてハッキングされた拡張機能と見なされていた時代からのレガシージャンクであり、標準ライブラリのデフォルトの動作はスレッドセーフではありませんでした。最新の実装では必要ないはずであり、標準ではありませんでした。(リエントラントスレッドセーフの意味は根本的に異なるため、これも誤った名称であることに注意してください。)

理論的には、POSIXではgetconf、スレッド化されたプログラムをコンパイルする場合に、次の構成オプションを照会して使用する必要があります。

  • POSIX_V7_THREADS_CFLAGS
  • POSIX_V7_THREADS_LDFLAGS

一方、gccには、スレッドのサポートを要求するための独自の競合する「ポータブル」な方法があり-pthreadます。オプションは、通常、スレッドが機能するために必要な事前定義されたマクロとライブラリを追加します。

于 2011-05-18T15:50:11.353 に答える
1

通常、次のようなオプションでコンパイルする必要があります-mt -pthread -thread(これは Sun CC に当てはまり、一部のプラットフォームでは gcc に当てはまります)。このオプションを使用すると、必要な定義を取得できます。これを使用しないと、間違ったライブラリをリンクしたり、コード生成の問題 (静的変数の初期化が保護されないなど) が発生したりする可能性があります。

于 2011-05-18T16:04:13.937 に答える