errno
はMSVCスレッドセーフですか?MSVC errnoスレッドの安全性
this questionの回答によると、POSIXでは、errno
がスレッドセーフであることが必要です。しかし、MSVCはおそらくPOSIXに準拠しておらず、MSDNはスレッドセーフについては何も教えていません。矛盾したMSDNはMSVCは間違いPOSIX準拠していないが、errno
がextern int errno;
として、だけでなく、#define errno (*_errno())
errno
はMSVCスレッドセーフですか?MSVC errnoスレッドの安全性
this questionの回答によると、POSIXでは、errno
がスレッドセーフであることが必要です。しかし、MSVCはおそらくPOSIXに準拠しておらず、MSDNはスレッドセーフについては何も教えていません。矛盾したMSDNはMSVCは間違いPOSIX準拠していないが、errno
がextern int errno;
として、だけでなく、#define errno (*_errno())
として宣言されていることを言及し、errno
はスレッドセーフな方法で(少なくともMSVC2008のような)MSVCランタイムで実装されています。
文書にはextern int errno
と記載されていますが、実際にはスレッドセーフティを課す機能を持つ#define
として実装されています。逆アセンブリウィンドウでこの機能を実行すると、スレッドローカルストレージが使用されていることが明らかです。
悲しいことに、これを確認する正式な文書はありませんが、それは人生です!
MSDNサイトでは、これがどこで議論されているのかわかりません。しかし、スタティックバッファを返す関数の多くは、すでにMSVCでスレッドセーフである(つまり、スレッドローカルバッファへのポインタを返す)。したがって、errnoがスレッドセーフでない場合は驚くべきことです。
MSVCヘッダはすべて、この定義を持つファイル:
#ifndef _CRT_ERRNO_DEFINED
#define _CRT_ERRNO_DEFINED
_CRTIMP extern int * __cdecl _errno(void);
#define errno (*_errno())
errno_t __cdecl _set_errno(_In_ int _Value);
errno_t __cdecl _get_errno(_Out_ int * _Value);
#endif /* _CRT_ERRNO_DEFINED */
や小テストプログラムは、errnoを設定2つのスレッドは少なくともお互いに影響を与えなかったことをshowd。 したがって、私は、スレッドセーフであると仮定するのは安全だと言いたいと思います(単一スレッドのCRTにリンクしている場合はおそらくそうではありません)
私は最近彼らがシングルスレッドCRTをしているとは思わない。 –
VS2005はこれ以来利用できませんでした。http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspxを参照してください。 –
どのVisual C++バージョンを使用していますか? –
@スティーブ:現在ほとんどMSVC 2010. –