Нужно ли -D_REENTRANT с -pthreads? - PullRequest
39 голосов
/ 18 мая 2009

В Linux (ядро 2.6.5) наша система сборки вызывает gcc с -D_REENTRANT.

Требуется ли это по-прежнему при использовании pthreads?

Как это связано с опцией gcc -pthread? Я понимаю, что я должен использовать -pthread с pthreads, мне все еще нужно -D_REENTRANT?

Кстати, есть ли разница между использованием REENTRANT между gcc 3.3.3 и gcc 4.x.x?

Когда я использую опцию -pthread gcc, я вижу, что _REENTRANT определяется. Будет ли пропуск -D_REENTRANT из командной строки иметь какое-то значение, например, могут ли некоторые объекты быть скомпилированы без многопоточной поддержки и затем связаны в двоичный файл, который использует pthreads и вызовет проблемы?

Я предполагаю, что все должно быть в порядке, просто использовать: g++ -pthread

> echo | g++          -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1

Мы собираем несколько статических библиотек и приложений, которые связываются со статическими библиотеками, и библиотеки, и приложения используют pthreads.

Я считаю, что это требовалось на каком-то этапе в прошлом, но я хочу знать, требуется ли оно до сих пор. Google не вернул ни одной недавней информации, упоминающей - D_REENTRANT с pthreads. Не могли бы вы указать мне ссылки или ссылки, обсуждающие использование в последней версии kernel / gcc / pthread ?

Уточнение: в настоящее время мы используем -D_REENTRANT и -lpthread, я предполагаю, что могу заменить их просто g ++ -pthread, глядя на man gcc, он устанавливает флаги для препроцессора и компоновщика. Есть мысли?

Ответы [ 3 ]

17 голосов
/ 21 мая 2009

Для меня лучшим ответом был комментарий от pts, если только он потрудился представить его как ответ:

Вы правильно исследовали и ответили твой собственный вопрос Используйте g++ -pthread, это эквивалентно g++ -lpthread -D_REENTRANT. Использование g++ -D_REENTRANT было бы другим, он может не устанавливать все флаги компоновщика. - оч 18 мая в 0:30

7 голосов
/ 18 мая 2009

со страниц информации gcc:

`-pthread'
     Adds support for multithreading with the "pthreads" library.  This
     option sets flags for both the preprocessor and linker.

Так что достаточно флага -pthread. Однако я бы не рекомендовал передавать его только в некоторый код.

Как предложил Крис в комментариях, использование gcc -dumpspecs в Linux действительно подтверждает, что он также устанавливает флаги препроцессора:

%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
5 голосов
/ 18 мая 2009

Флаг -pthreads gcc устанавливает соответствующие флаги компилятора и компоновщика, необходимые для поддержки pthreads на платформе, на которой вы работаете.

Вы правы, в Linux x86 (и, вероятно, на многих других платформах) это эквивалентно '-D_REENTRANT -lpthread', но это не обязательно верно для всех платформ.

(В течение, по крайней мере, некоторого времени в aix -pthread приводил к тому, что g ++ связывался с совершенно другим libstdc ++. А. Не знаю, так ли это сейчас, хотя ...)

...