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