【问题标题】:Why do we write -D_REENTRANT while compiling C code using threads为什么我们在使用线程编译C代码时要写-D_REENTRANT
【发布时间】:2013-12-19 04:17:32
【问题描述】:

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

【问题讨论】:

标签: gcc


【解决方案1】:

实际上,在 GCC 中使用线程进行编译的推荐方法是使用 -pthread 选项。相当于-lpthread -D_REENTRANT,所以你其实没问题。

标志执行以下操作:

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

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

【讨论】:

  • 对于 GCC 6 和更早版本,-pthread 是 RS/6000 和 PowerPC 以及 Solaris 2 的特定于机器的选项。从 GCC 7 开始,-pthread 已被推广到所有平台。 (GCC 7 于 2017 年 5 月发布,这个答案是在那之前 3 年多写的。)
【解决方案2】:

您不必编写它。但建议这样做。

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

【讨论】:

    【解决方案3】:

    gcc 这样的编译器使用-D namename 预定义为具有1 定义的宏。

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

    如果此宏未传递给编译器,则编译器指令_REENTRANT 将是false0

    以 /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 链接。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多