В 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, который устанавливает флаги как для препроцессора, так и для компоновщика. Есть предположения?
Вы правильно изучили и ответили на свой вопрос. Используйте 'g ++ -pthread', он эквивалентен' g ++ -pthread -D_REENTRANT'. Использование 'g ++ -D_REENTRANT' будет отличаться, оно может не устанавливать все флаги компоновщика. – pts
Хм, это либо 'g ++ -D_REENTRANT -lpthread', либо' g ++ -pthread', обе формы имеют одинаковый эффект? – stefanB
Используйте -pthread, а не -lpthread. Параметр -pthread устанавливает все флаги, необходимые для потоковой передачи, независимо от того, на какой платформе вы находитесь. Использование -lpthread будет связываться только с libpthread, чего может быть недостаточно для некоторых платформ. (например, OpenBSD не использовал libpthread - вместо этого использовался libc_r.) –