2

次のようなコードを見て、これがスレッドセーフかどうか疑問に思いました。

int savedErrno = errno;

//call some function that may modifies errno

if (errno == xxx)
   foo();

errno = savedErrno;

これはスレッドセーフではないと思いますが、正しいですか?

しかし、私は人々がこのようなコードを書いているのを見たので、よくわかりません...

これを明確にするのを手伝ってくれる人はいますか、ありがとう...

4

2 に答える 2

9

各スレッドには独自の (スレッド固有の) errno のコピーがあるため、安全であるように見えます。

男から (3) errno:

errno は、ISO C 標準によって、int 型の変更可能な左辺値であると定義されており、明示的に宣言してはなりません。errno はマクロの場合があります。errno はスレッドローカルです。あるスレッドで設定しても、他のスレッドの値には影響しません。

于 2011-12-11T01:04:37.067 に答える
1

コードは 1 つのスレッドでのみ errno を使用しています。実際、コードは 1 つのスレッドのみを示しています。したがって、このスニペットはスレッドセーフです。

于 2011-12-11T01:10:43.767 に答える