Подтвердить что ты не робот

Нужно ли мне -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, который устанавливает флаги как для препроцессора, так и для компоновщика. Любые мысли?

4b9b3361

Ответ 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. Я не знаю, если это все еще так, хотя...)