2011-06-20 2 views
10

Est-errno sur MSVC thread-safe?MSVC errno sécurité des threads

Selon les réponses dans this question POSIX exige que errno est thread-safe. Mais MSVC n'est probablement pas compatible POSIX et MSDN ne dit rien sur la sécurité des threads. MSDN mentionne que contradictoires errno est déclarée comme extern int errno;, mais aussi comme #define errno (*_errno())

+0

Quelle version de Visual C++ utilisez-vous? –

+0

@Steve: Actuellement principalement MSVC 2010. –

Répondre

13

Bien que MSVC est certainement pas compatible POSIX, errno est implémenté dans l'exécution MSVC (au moins de MSVC2008) d'une manière threadsafe.

Bien que la documentation indique que c'est extern int errno, elle est implémentée en tant que #define à une fonction qui permet d'imposer la sécurité des threads. Si vous parcourez cette fonction dans la fenêtre de désassemblage, il est clair que le stockage local du thread est utilisé. Malheureusement, je ne peux pas pointer vers une documentation officielle qui confirme cela, mais telle est la vie!

2

Je ne trouve nulle part sur le site MSDN où cela est discuté. Cependant, de nombreuses fonctions qui retournent des tampons statiques sont déjà thread safe dans MSVC (c'est-à-dire qu'elles renvoient des pointeurs vers des tampons locaux de thread). Il serait donc surprenant que errno ne soit pas sécurisé.

L'en-tête MSVC fichiers ont tous cette définition:

#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 */ 

Et un petit programme de test showd que 2 fils de réglage errno au moins ne pas affecté eachother. Donc, je dirais qu'il est prudent de supposer que errno est thread-safe (mais probablement pas si vous liez au CRT thread unique)

+0

Je ne pense pas qu'ils font un seul thread CRT ces jours-ci. –

+0

Pas depuis que VS2005 est disponible - voir http://msdn.microsoft.com/fr-fr/library/abx4dbyh(v=vs.80).aspx –