【发布时间】:2013-12-19 04:17:32
【问题描述】:
当我们编译一个在其中实现了线程的 C 程序时,我们会编写这个语句。
我不明白为什么我们在这里使用 -D_REENTRANT。
例如gcc t1.c -lpthread -D_REENTRANT
【问题讨论】:
标签: gcc
当我们编译一个在其中实现了线程的 C 程序时,我们会编写这个语句。
我不明白为什么我们在这里使用 -D_REENTRANT。
例如gcc t1.c -lpthread -D_REENTRANT
【问题讨论】:
标签: gcc
实际上,在 GCC 中使用线程进行编译的推荐方法是使用 -pthread 选项。相当于-lpthread -D_REENTRANT,所以你其实没问题。
标志执行以下操作:
-lpthread 指示链接器使用适当的库版本来实现线程兼容性。
-D_REENTRANT 告诉编译器使用线程使用所需的声明(函数、类型等)。
【讨论】:
您不必编写它。但建议这样做。
Defining _REENTRANT 使编译器使用 C 库中多个函数的线程安全(即可重入)版本。
【讨论】:
像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 链接。
【讨论】: