c - 我是否需要在编译时添加一个 _REENTRANT 宏以使我的 errno 线程安全?

标签 c multithreading compiler-construction errno

我是否需要在编译时添加一个 _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/

相关文章:

c - 我的段错误在哪里?

c - 使用不同数据类型定义同一变量时 C 代码的工作方式

c++ - 分解在 Visual C++ 中不起作用的函数

c++ - 使用 ISO C++0x 线程会降低性能

JavaFX 关闭窗口的默认实现

c - 抽象语法树问题

java - 如何在CMD中设置编译和运行Java

c - 我的函数不记住链表的头

c++ - 在 C++ 中使用线程创建 QT gui?

c - CPU/编程语言使用哪种幂运算算法?