2009-05-18 3 views
39

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

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

+16

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

+0

Хм, это либо 'g ++ -D_REENTRANT -lpthread', либо' g ++ -pthread', обе формы имеют одинаковый эффект? – stefanB

+6

Используйте -pthread, а не -lpthread. Параметр -pthread устанавливает все флаги, необходимые для потоковой передачи, независимо от того, на какой платформе вы находитесь. Использование -lpthread будет связываться только с libpthread, чего может быть недостаточно для некоторых платформ. (например, OpenBSD не использовал libpthread - вместо этого использовался libc_r.) –

ответ

17

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

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

+1

Должно ли быть «... это эквивалентно g ++ -lpthread -D_REENTRANT»? то есть второй -pthread должен быть -lpthread – BCran

+0

Правильно, вероятно, опечатка в исходном комментарии ... – stefanB

7

Из ССАГПЗ страниц информации:

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

Так просто -pthread флаг должен быть достаточным. Тем не менее, я бы не рекомендовал передавать его только на некоторые из ваших кодов.

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

%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} 
5

GCC устанавливает соответствующий компилятор и компоновщик флаги, необходимый для поддержки PThreads на платформе, на которой вы находитесь.

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

(По крайней мере, некоторое время, на aix, -pthread, вызвало g ++ ссылку в совершенно другом libstdC++. A. Я не знаю, если это все еще так, хотя ...)

+0

* «По крайней мере некоторое время, на aix, -pthread, вызвало g ++ для связи в совершенно другом libstdC++. A« * - +1 », это очистило аварийную ситуацию в AIX, потому что мы не использовали' -pthread' или '-D_REENTRANT ', но мы использовали' -lpthread'. – jww

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