7

我是否需要在编译期间添加 _REENTRANT 宏以使我的 errno 线程安全?

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

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

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

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

4

2 回答 2

11

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

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

  • POSIX_V7_THREADS_CFLAGS
  • POSIX_V7_THREADS_LDFLAGS

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

于 2011-05-18T15:50:11.353 回答
1

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

于 2011-05-18T16:04:13.937 回答