【问题标题】: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())

【问题讨论】:

  • 您使用的是哪个 Visual C++ 版本?
  • @Steve:目前主要是 MSVC 2010。

标签: 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 可能不是)

    【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2021-07-12
    相关资源
    最近更新 更多