什么是_REENTRANT标志?

Vij*_*jay 24 c c++ multithreading pthreads

编译多线程程序我们使用gcc如下:

gcc -lpthread -D_REENTRANT -o someprogram someprogram.c
Run Code Online (Sandbox Code Playgroud)

国旗到底在-D_REENTRANT做什么?

Jay*_*ayM 22

定义_REENTRANT会导致编译器在C库中使用多个函数的线程安全(即可重入)版本.

您可以搜索头文件以查看定义时发生的情况.


Quu*_*one 6

JayM回答:

定义_REENTRANT会使编译器使用C库中多个函数的线程安全(即可重入)版本。

您可以搜索头文件以查看定义后的情况。

由于OP和我都对该问题感兴趣,因此我决定实际发布答案。:) _REENTRANT在Mac OS X 10.11.6上会发生以下情况:

  • <math.h>收益的声明lgammaf_rlgamma_rlgammal_r

在Linux(Red Hat Enterprise Server 5.10)上,我看到以下更改:

  • <unistd.h>获得POSIX 1995函数的声明getlogin_r

因此_REENTRANT,这些天来似乎几乎是无人值守。它可能曾经声明了许多新功能,例如strtok_r;;。但是如今,这些功能大部分是由数十年的标准(C99,POSIX 95,POSIX.1-2001等)强制执行的,因此始终处于启用状态。

我不知道为什么我检查的两个系统都避免声明lgamma_rresp。getlogin_r_REENTRANT #defined定义。我的疯狂猜测是,这只是历史遗留问题,没有人会费心去清理。

当然,我对这两个系统的观察可能无法推广到您的代码可能遇到的所有系统。每当您的程序需要pthreads时,您仍然绝对应该-pthread将其传递给编译器(或者,不太好,但是还可以-lpthread -D_REENTRANT)。


abu*_*bua 5

libc 8.2手册摘录:

巨集:_REENTRANT
巨集:_THREAD_SAFE

这些宏已过时。它们的作用与使用值199506L定义_POSIX_C_SOURCE的作用相同。

一些非常老的C库要求为基本功能(例如getchar)定义这些宏之一是线程安全的。

我们建议您在新程序中使用_GNU_SOURCE。如果您未为GCC指定'-ansi'选项或其他符合性选项(例如-std = c99),并且未明确定义任何这些宏,则其效果与将_DEFAULT_SOURCE定义为1相同。

当您定义功能测试宏以请求更大的功能类别时,另外为这些功能的子集定义功能测试宏是无害的。例如,如果定义_POSIX_C_SOURCE,则定义_POSIX_SOURCE也无效。同样,如果定义_GNU_SOURCE,则定义_POSIX_SOURCE或_POSIX_C_SOURCE也无效。


Jer*_*fin 0

它只是为预处理器定义了_REENTRANT。在相关代码的某个地方,您可能至少会在几个地方找到#ifdef _REENTRANT或。#if defined(_REENTRANT)

另请注意,名称“_REENTRANT:位于实现者的名称空间中(任何以下划线开头的名称,后跟另一个下划线或大写字母),因此定义它意味着您已经超出了标准定义的范围(至少是 C或 C++ 标准)。