2013-12-19 2 views
4

Мы пишем этот оператор при компиляции C-программы, в которой реализованы потоки. Я не мог понять, почему мы здесь используем -D_REENTRANT. например gcc t1.c -lpthread -D_REENTRANTПочему мы пишем -D_REENTRANT при компиляции кода C с помощью потоков

+1

Возможный дубликат [Что такое флаг \ _REENTRANT?] (Http://stackoverflow.com/questions/2601753/what-is-the-reentrant-flag) – Calimo

ответ

5

Вам не нужно его писать. Но это рекомендуется.

Defining _REENTRANT заставляет компилятор использовать поточно-безопасные (то есть повторные) версии нескольких функций в библиотеке C.

7

На самом деле, рекомендуемый способ компиляции с потоками в GCC использует опцию -pthread. Это эквивалентно -lpthread -D_REENTRANT, поэтому у вас нет проблем.

флаги сделать следующее:

  • -lpthread инструктирует компоновщик использовать соответствующие версии библиотек для совместимости потоков.

  • -D_REENTRANT сообщает компилятору использовать декларации (функции, типы, ...), необходимые для использования потоков.

3

Составители как gcc использовать -Dname предопределить 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.

Смежные вопросы