我是否需要在编译时添加一个 _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
选项,它通常会添加线程工作所需的任何预定义宏和库。
关于c - 我是否需要在编译时添加一个 _REENTRANT 宏以使我的 errno 线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6047333/