1. ホーム
  2. c

[解決済み】 errnoはスレッドセーフですか?

2022-04-12 18:45:28

質問

errno.h として宣言されています。 extern int errno; ということで、質問なんですが errno の値は、マルチスレッドコードで、いくつかの呼び出しの後、または perror() を使用します。これはスレッドセーフな変数なのでしょうか?そうでない場合、代替案は何ですか?

私は、x86アーキテクチャでgccとLinuxを使用しています。

解決方法を教えてください。

はい、スレッドセーフです。 Linuxでは、グローバル変数errnoはスレッド固有です。 POSIXでは、errnoはスレッドセーフであることが要求されています。

参照 http://www.unix.org/whitepapers/reentrant.html

POSIX.1では、errnoは次のように定義されています。 外部グローバル変数 しかし、この の定義が受け入れられません。 マルチスレッド環境では を使用すると、非決定的な の結果が得られます。問題は、2つ以上の のスレッドでエラーが発生し、そのすべてのスレッドで 同じ errno が設定されるようにする。 このような状況下で、あるスレッド の後に errno をチェックすることになるかもしれません。 によってすでに更新されている スレッドになります。

この結果生じる 非決定性、POSIX.1cでは errno は スレッドごとのエラー番号は次のとおりです。 (iso/iec 9945:1-1996, §2.4)。

関数によっては、エラー番号をアクセスする変数で提供するものもあります。 シンボルerrnoを通して シンボル errno は ヘッダで指定されています。 C 言語標準 ... あるスレッドの各スレッドに対して プロセスでは,errnoの値は 関数呼び出しの影響を受けるか 他のスレッドから errno に代入される。

以下もご参照ください。 http://linux.die.net/man/3/errno

errnoはスレッドローカルです。あるスレッドで設定しても、他のスレッドでの値には影響しません。