Нужно ли мне -D_REENTRANT с -pthreads?
В 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.
Я считаю, что это было необходимо на каком-то этапе в прошлом, но нужно знать, требуется ли это еще. Googling не возвратил никакой недавней информации - D_REENTRANT
с pthreads
. Не могли бы вы указать мне ссылки или ссылки, обсуждая использование в последней версии kernel/gcc/pthread?
Уточнение: В настоящий момент мы используем -D_REENTRANT и -lpthread, я предполагаю, что могу заменить их только g++ -pthread, глядя на человека gcc, который устанавливает флаги как для препроцессора, так и для компоновщика. Любые мысли?
Ответы
Ответ 1
Для меня лучшим ответом был комментарий от pts
, если только он потрудился представить его как ответ:
Вы правильно изучили и ответили ваш собственный вопрос. Используйте g++ -pthread
, это эквивалентно g++ -lpthread -D_REENTRANT
. Использование g++ -D_REENTRANT
будет отличаться, он может не устанавливать все флаги компоновщика. - pts 18 мая в 0:30
Ответ 2
Из информационных страниц 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}
Ответ 3
Флаг gcc -pthreads устанавливает соответствующие флаги компилятора и компоновщика, необходимые для поддержки pthreads на платформе, на которой вы находитесь.
Вы правы, на Linux x86 (и, вероятно, на многих других платформах), что эквивалентно '-D_REENTRANT -lpthread', но это не обязательно верно для всех платформ.
(По крайней мере, некоторое время, на aix, -pthread вызвало g++ для ссылки в совершенно другом libstdС++. a. Я не знаю, если это все еще так, хотя...)