【问题标题】:Is it required for me to add a _REENTRANT macro during compile time to make my errno thread safe?我是否需要在编译期间添加 _REENTRANT 宏以使我的 errno 线程安全?
【发布时间】:2011-05-18 15:36:40
【问题描述】:

我是否需要在编译时添加 _REENTRANT 宏以确保我的 errno 线程安全?

如果不是,是所有版本的 gcc / linux / solaris 都需要,还是某些旧版本需要?

我最近测试了一段未使用 _REENTRANT 的代码,发现 errno 在多线程环境中的行为未定义?但是,添加 _REENTRANT 后一切正常。环境是 Solaris。

但是,here 的讨论似乎并没有说必须添加 _REENTRANT。我有点困惑。

此外,除了 _REENTRANT 之外,我还应该添加任何其他选项或库以确保我的应用程序具有线程安全的 errno?

【问题讨论】:

    标签: c multithreading compiler-construction errno


    【解决方案1】:

    实际上,_REENTRANT 是遗留的垃圾,当时线程被认为是现有实现之上的扩展,标准库的默认行为不是线程安全的。在现代实现中不应该需要它,而且它从来都不是标准的。 (请注意,这也是用词不当,因为 reentrantthread-safe 具有完全不同的含义。)

    理论上,如果您正在编译线程程序,POSIX 要求您通过getconf 查询和使用以下配置选项:

    • POSIX_V7_THREADS_CFLAGS
    • POSIX_V7_THREADS_LDFLAGS

    另一方面,gcc 有自己的冲突“可移植”方式来请求线程支持:-pthread 选项,它通常添加线程工作所需的任何预定义宏和库。

    【讨论】:

      【解决方案2】:

      通常您需要使用 -mt -pthread -thread 之类的选项进行编译(对于 Sun CC 和对于某些平台,对于 gcc 来说是这样)。使用此选项,您可以获得所需的定义。如果你不使用它,你可能会链接错误的库,甚至会出现代码生成问题(例如对静态变量初始化没有保护)。

      【讨论】:

        猜你喜欢
        • 2010-11-06
        • 2013-12-07
        • 2016-05-08
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 2016-11-02
        相关资源
        最近更新 更多