Gcc 为什么在使用线程编译C代码时要编写-D_可重入

Gcc 为什么在使用线程编译C代码时要编写-D_可重入,gcc,Gcc,我们在编译一个有线程的C程序时写这条语句。 我不明白为什么我们在这里使用-D_可重入。 e、 ggcct1.c-lpthread-D_可重入实际上,建议在gcc中使用线程进行编译的方法是使用-pthread选项。它相当于-lpthread-D_可重入,因此实际上没有问题 这些标志执行以下操作: -lpthread指示链接器使用适当的库版本以实现线程兼容性 -D_REENTRANT告诉编译器使用线程使用所需的声明(函数、类型等) 类似于gcc的编译器使用-D名称预定义名称,作为定义为1的宏 在程

我们在编译一个有线程的C程序时写这条语句。 我不明白为什么我们在这里使用-D_可重入。
e、 g
gcct1.c-lpthread-D_可重入

实际上,建议在gcc中使用线程进行编译的方法是使用
-pthread
选项。它相当于
-lpthread-D_可重入
,因此实际上没有问题

这些标志执行以下操作:

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

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


类似于
gcc
的编译器使用
-D
名称
预定义
名称
,作为定义为
1
的宏

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

如果未将此宏传递给编译器,则编译器指令
\u REENTRANT
将为
false
0

以/usr/include/features.h中的示例为例

#if defined _REENTRANT || defined _THREAD_SAFE
# define __USE_REENTRANT    1
#endif
您将看到,如果定义了_REENTRANT,它会告诉编译器该怎么做

最后,您必须将代码重新链接到
pthread
库中,这样您就可以使用
pthread_*()
族,如
pthread_create()
pthread_join()


-lpthread
被传递到链接器时,代码将与
libpthread链接。因此

您不必编写它。但这是推荐的


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

对于GCC 6和早期版本,可能会重复,-pthread是RS/6000和PowerPC以及Solaris 2的机器特定选项。自GCC 7以来,-pthread已被推广到所有平台。(GCC 7于2017年5月发布,该答案在发布前3年多就写好了。)