【问题标题】:MSVC errno thread safetyMSVC errno 线程安全
【发布时间】:2011-09-18 18:36:13
【问题描述】:
MSVC 上的errno 是线程安全的吗?
根据this question 中的答案,POSIX 要求errno 是线程安全的。但是 MSVC 可能不符合 POSIX,MSDN 并没有说明线程安全的任何内容。 MSDN矛盾提到errno被声明为extern int errno;,但也被声明为#define errno (*_errno())
【问题讨论】:
标签:
c
visual-c++
thread-safety
【解决方案1】:
虽然 MSVC 绝对不符合 POSIX,但errno 在 MSVC 运行时(至少从 MSVC2008 开始)以线程安全的方式实现。
虽然文档声明它是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 */
还有一个小测试程序显示2个线程设置errno至少不会互相影响。
所以我会说假设 errno 是线程安全的是安全的(尽管如果你链接到单线程 CRT 可能不是)