我是否需要在编译时添加 _REENTRANT 宏以使我的 errno 线程安全?
如果不是,是所有版本的 gcc / linux /Solaris 都是这样还是某些旧版本需要?
我最近测试了一段未使用_REENTRANT的代码,发现errno在多线程环境中以未定义的方式表现?但是,添加 _REENTRANT 后一切正常。环境是 Solaris。
但是,here的讨论似乎并没有说必须添加_REENTRANT。我有点困惑。
此外,除了 _REENTRANT 之外,我是否应该添加任何其他选项或库以确保我的应用程序具有线程安全的 errno?
实际上,
_REENTRANT
是遗留垃圾,当时线程被认为是现有实现之上的扩展,并且标准库的默认行为不是线程安全的。现代实现不需要它,而且它从来都不是标准的。 (请注意,这也是一个用词不当,因为可重入和线程安全具有完全不同的含义。)
理论上,如果您正在编译线程程序,POSIX 要求您通过
getconf
查询并使用以下配置选项:
POSIX_V7_THREADS_CFLAGS
POSIX_V7_THREADS_LDFLAGS
另一方面,gcc 有自己冲突的“可移植”方式来请求线程支持:
-pthread
选项,该选项通常添加线程工作所需的任何预定义宏和库。
通常您需要使用诸如
-mt
-pthread
-thread
之类的选项进行编译(这对于 Sun CC 来说是正确的,对于某些平台,对于 gcc 也是如此)。 通过此选项,您可以获得所需的定义。 如果你不使用它,你可能会链接错误的库,甚至会出现代码生成问题(例如静态变量初始化没有保护)。