为什么我们在使用线程编译C代码时编写-D_REENTRANT

Ahm*_*med 4 gcc

当我们编译一个在其中实现了线程的C程序时,我们编写这个语句.我不明白为什么我们在这里使用-D_REENTRANT.例如gcc t1.c -lpthread -D_REENTRANT

rod*_*igo 10

实际上,在GCC中使用线程编译的推荐方法是使用该-pthread选项.这相当于-lpthread -D_REENTRANT你实际上没有问题.

标志执行以下操作:

  • -lpthread 指示链接器使用适当的库版本来实现线程兼容性.

  • -D_REENTRANT 告诉编译器使用线程使用所必需的声明(函数,类型,...).


alv*_*its 5

编译器喜欢gcc使用-D name定义来预定义name为宏1

在程序源代码和头文件中,您将看到编译器指令,这些指令_REENTRANT在此宏为true或时检查并执行某些操作1

如果此宏未传递给编译器,则编译器指令_REENTRANT将为falseor 0

从 /usr/include/features.h 中获取此示例。

#if defined _REENTRANT || defined _THREAD_SAFE
# define __USE_REENTRANT    1
#endif
Run Code Online (Sandbox Code Playgroud)

您将看到它告诉编译器在定义了 _REENTRANT 时要做什么。

最后,你要链接代码againspthread库,以便您可以用pthread_*()家庭一样pthread_create()pthread_join()

-lpthread传递给链接器时,代码与libpthread.so.


Khu*_*aza 5

你不必写它.但建议.

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