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

6

当我们编写一个实现线程的C程序时,会使用-D_REENTRANT参数。

我不明白为什么要在这里使用-D_REENTRANT。

例如:gcc t1.c -lpthread -D_REENTRANT

2
可能是什么是_REENTRANT标志?的重复。 - Calimo
3个回答

12

实际上,在GCC中使用线程的推荐方法是使用-pthread选项。它等同于-lpthread -D_REENTRANT,因此你实际上没有问题。

这些标志的作用如下:

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

  • -D_REENTRANT告诉编译器使用与线程使用相关的声明(函数、类型等)。


对于GCC 6及更早版本,-pthread是RS/6000和PowerPC以及Solaris 2的机器特定选项。自GCC 7以来,-pthread已经被推广到所有平台。(GCC 7于2017年5月发布,而本答案是在那之前3年写的。) - Jetski S-type

6
编译器(如gcc)使用-D name来预定义名为name的宏,并将其定义为1。在程序源代码和头文件中,您会看到编译器指令检查_REENTRANT,当此宏为true或1时执行某些操作。如果未将此宏传递给编译器,则编译器指令_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.so链接。

6

不一定需要编写它,但建议这样做。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接