MSVC errno thread sécurité

errno est-il sur MSVC thread-safe?

D’après les réponses à cette question, POSIX exige errno soit thread-safe. Mais MSVC n’est probablement pas conforme à POSIX et MSDN ne dit rien sur la sécurité des threads. MSDN indique de manière contradictoire errno est déclaré en tant que extern int errno; , mais aussi en tant que #define errno (*_errno())

Bien que MSVC ne soit définitivement pas conforme à POSIX, errno contient le code d’erreur d’exécution (du moins à partir de MSVC2008) dans l’environnement d’exécution de MSVC.

Bien que la documentation indique qu’il s’agit de extern int errno il est en réalité implémenté en tant que #define à une fonction permettant 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 des threads est utilisé.

Malheureusement, je ne peux citer aucun document officiel qui le confirme, mais telle est la vie!

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 aux threads des tampons locaux). Donc, il serait surprenant que errno ne soit pas thread-safe.

Les fichiers d’en-tête MSVC 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 a montré que le paramétrage de 2 threads avec errno n’affectait pas du moins l’un à l’autre. Donc, je dirais qu’il est prudent de supposer que errno est thread-safe (bien que ce ne soit probablement pas le cas si vous créez un lien vers le tube cathodique à thread unique)