Какова цель использования [-D_REENTRANT ] для компиляции потоковой программы на c в Ubuntu? [закрыто]

Используйте любой редактор для набора вашей программы, а затем скомпилируйте ее с помощью компилятораgcc:

$ gcc t1.c -o t1 -lpthread [-D_REENTRANT]
$ ./t1s
Hello world!...
0
задан 25 October 2018 в 10:25

2 ответа

Из 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. Это относится к каждому модулю приложения.

Для смешанных приложений (например, потоков Solaris с семантикой POSIX) скомпилируйте с флагами -D_REENTRANT и -D_POSIX_PTHREAD_SEMANTICS.

Чтобы скомпилировать однопоточное приложение, не определяйте ни флаг -D_REENTRANT, ни флаг -D_POSIX_C_SOURCE. Когда эти флаги отсутствуют, все старые определения errno, stdio и т. Д. Остаются в силе.


Примечание -

Компилировать однопоточные приложения, не связанные ни с одной из библиотек потоков (libthread.so.1 или libpthread.so.1), без -D_REENTRANT флаг. Это устраняет снижение производительности, возникающее при преобразовании макросов, таких как putc (3s), в повторяющиеся вызовы функций.


Подводя итог, приложения POSIX, которые определяют -D_POSIX_C_SOURCE, получают семантику POSIX 1003.1c для подпрограмм, перечисленных в таблице 7-1. Приложения, которые определяют только -D_REENTRANT, получают семантику Solaris для этих подпрограмм. Приложения Solaris, которые определяют -D_POSIX_PTHREAD_SEMANTICS, получают семантику POSIX для этих подпрограмм, но все еще могут использовать интерфейс потоков Solaris.

Приложения, которые определяют как -D_POSIX_C_SOURCE, так и -D_REENTRANT, получают семантику POSIX.

1
ответ дан 27 October 2019 в 07:19

Это взято из руководства libc 8.2:

Макрос: _REENTRANT
Макрос: _THREAD_SAFE

Они макросы являются устаревшими. Они имеют тот же эффект как определяющий _POSIX_C_SOURCE со значением 199506L.

Некоторые очень старые библиотеки C потребовали, чтобы один из них макросы был определен для основной функциональности (например, getchar), чтобы быть ориентированным на многопотоковое исполнение.

Мы рекомендуем использовать _GNU_SOURCE в новых программах. Если Вы не указываете ‘-ansi’ опция к GCC или другие опции соответствия, такие как-std=c99, и не определяете ни одного из них макросы явно, эффект совпадает с определением _DEFAULT_SOURCE к 1.

При определении тестового макроса функции для запроса большего класса функций, это безопасно для определения, кроме того, тестового макроса функции для подмножества тех функций. Например, если Вы определяете _POSIX_C_SOURCE, затем определение _POSIX_SOURCE также не имеет никакого эффекта. Аналогично, если Вы определяете _GNU_SOURCE, затем определение или _POSIX_SOURCE или _POSIX_C_SOURCE также не имеет никакого эффекта.

0
ответ дан 27 October 2019 в 07:19

Другие вопросы по тегам:

Похожие вопросы: