2011-06-20 19 views
10

errnoはMSVCスレッドセーフですか?MSVC errnoスレッドの安全性

this questionの回答によると、POSIXでは、errnoがスレッドセーフであることが必要です。しかし、MSVCはおそらくPOSIXに準拠しておらず、MSDNはスレッドセーフについては何も教えていません。矛盾したMSDNはMSVCは間違いPOSIX準拠していないが、errnoextern int errno;として、だけでなく、#define errno (*_errno())

+0

どのVisual C++バージョンを使用していますか? –

+0

@スティーブ:現在ほとんどMSVC 2010. –

答えて

13

として宣言されていることを言及し、errnoはスレッドセーフな方法で(少なくともMSVC2008のような)MSVCランタイムで実装されています。

文書にはextern int errnoと記載されていますが、実際にはスレッドセーフティを課す機能を持つ#defineとして実装されています。逆アセンブリウィンドウでこの機能を実行すると、スレッドローカルストレージが使用されていることが明らかです。

悲しいことに、これを確認する正式な文書はありませんが、それは人生です!

2

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にリンクしている場合はおそらくそうではありません)

+0

私は最近彼らがシングルスレッドCRTをしているとは思わない。 –

+0

VS2005はこれ以来利用できませんでした。http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspxを参照してください。 –

関連する問題