MSVC errno потокобезопасность - PullRequest
11 голосов
/ 20 июня 2011

Является ли errno в MSVC поточно-ориентированным?

Согласно ответам в этот вопрос POSIX требует, чтобы errno был поточно-ориентированным. Но MSVC, вероятно, не соответствует POSIX, и MSDN ничего не говорит о безопасности потоков. MSDN противоречиво упоминает, что errno объявлен как extern int errno;, но также как #define errno (*_errno())

Ответы [ 2 ]

14 голосов
/ 20 июня 2011

Хотя MSVC определенно не совместим с POSIX, errno реализован во время выполнения MSVC (по крайней мере с MSVC2008) в поточно-ориентированном режиме.

Хотя в документации указано, что это extern int errno, на самом деле она реализована как #define для функции, которая позволяет навязывать потокобезопасность. Если вы выполните эту функцию в окне разборки, станет ясно, что используется локальное хранилище потока.

К сожалению, я не могу указать на какую-либо официальную документацию, которая подтверждает это, но такова жизнь!

3 голосов
/ 20 июня 2011

Я не могу найти нигде на сайте 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 */

И небольшая тестовая программа показала, что установка 2 потоков, по крайней мере, не влияла друг на друга. Поэтому я бы сказал, что можно предположить, что errno является потокобезопасным (хотя, вероятно, нет, если вы ссылаетесь на CRT с одним потоком)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...