在 Ubuntu 中使用 [-D_REENTRANT ] 编译 c 语言线程程序的目的是什么?

在 Ubuntu 中使用 [-D_REENTRANT ] 编译 c 语言线程程序的目的是什么?

使用任意编辑器输入程序,然后使用 gcc 编译器进行编译:

$ gcc   t1.c –o t1 –lpthread [-D_REENTRANT]
$ ./t1s
Hello world!...

答案1

https://docs.oracle.com/cd/E19455-01/806-5257/compile-4/index.html

定义 _REENTRANT 或 _POSIX_C_SOURCE

对于 POSIX 行为,使用 -D_POSIX_C_SOURCE 标志集 >= 199506L 编译应用程序。对于 Solaris 行为,使用 -D_REENTRANT 标志编译多线程程序。这适用于应用程序的每个模块。

对于混合应用程序(例如,具有 POSIX 语义的 Solaris 线程),使用 -D_REENTRANT 和 -D_POSIX_PTHREAD_SEMANTICS 标志进行编译。

要编译单线程应用程序,请勿定义 -D_REENTRANT 或 -D_POSIX_C_SOURCE 标志。当不存在这些标志时,errno、stdio 等的所有旧定义仍然有效。


笔记 -

编译不与任何线程库(libthread.so.1 或 libpthread.so.1)链接的单线程应用程序,不使用 -D_REENTRANT 标志。这可消除将宏(如 putc(3s))转换为可重入函数调用时导致的性能下降。


总而言之,定义 -D_POSIX_C_SOURCE 的 POSIX 应用程序将获得表 7-1 中列出的例程的 POSIX 1003.1c 语义。仅定义 -D_REENTRANT 的应用程序将获得这些例程的 Solaris 语义。定义 -D_POSIX_PTHREAD_SEMANTICS 的 Solaris 应用程序将获得这些例程的 POSIX 语义,但仍可使用 Solaris 线程接口。

同时定义 -D_POSIX_C_SOURCE 和 -D_REENTRANT 的应用程序获得 POSIX 语义。

答案2

这是取自libc 8.2 手册

宏:_REENTRANT
宏:_THREAD_SAFE

这些宏已过时。它们与使用值 199506L 定义 _POSIX_C_SOURCE 具有相同的效果。

一些非常古老的 C 库需要定义其中一个宏来实现基本功能(例如 getchar)的线程安全。

我们建议您在新程序中使用 _GNU_SOURCE。如果您没有为 GCC 指定“-ansi”选项或其他一致性选项(如 -std=c99),并且没有明确定义任何这些宏,则效果与将 _DEFAULT_SOURCE 定义为 1 相同。

当您定义功能测试宏来请求更大类别的功能时,为这些功能的子集另外定义功能测试宏是无害的。例如,如果您定义 _POSIX_C_SOURCE,那么定义 _POSIX_SOURCE 也没有任何效果。同样,如果您定义 _GNU_SOURCE,那么定义 _POSIX_SOURCE 或 _POSIX_C_SOURCE 也没有任何效果。

相关内容