Значение флага -pthread при компиляции

143

В различных многопоточных проектах C и C ++ я видел, как этот -pthreadфлаг применялся как на этапе компиляции, так и на этапе компоновки, в то время как другие не использовали его вообще и просто переходили -lpthreadна этап компоновки.

Есть ли опасность не компилировать и не связываться с -pthreadфлагом - т.е. что на -pthreadсамом деле делает? Меня в первую очередь интересуют платформы Linux.

Leeeroy
источник

Ответы:

108

Пытаться:

gcc -dumpspecs | grep pthread

и ищите все, что начинается с %{pthread:.

На моем компьютере это приводит к компиляции файлов -D_REENTRANTи связыванию с ними -lpthread. На других платформах это могло отличаться. Используйте -pthreadдля большей мобильности.

Использование _REENTRANTв GNU libc изменяет способ работы некоторых заголовков libc. В качестве конкретного примера он вызывает errnoфункцию, возвращающую локальное расположение потока.

Крис Джестер-Янг
источник
3
Это может быть не только errnoи препроцессинг в целом. Я не уверен, насколько уместна на практике статья hpl.hp.com/techreports/2004/HPL-2004-209.pdf для оптимизации gcc, но я уверен, что был впечатлен глубиной обзора в ней.
Паскаль Куок
2
Я не думаю, что пример с errno верен. Даже без флага -pthread или определения _REENTRANT мои errno.h (glibc 2.10.1) и gcc (4.4.1 на amd64) генерируют динамический вызов для обработки errno и не связываются с адресом символа.
Энди Росс
1
@Pascal: Спасибо за ссылку. На данный момент это звучит немного выше моей головы, но кажется, что центральным моментом является то, что многопоточность не может быть просто «прикреплена», но вместо этого должна быть разработана как часть модели памяти. Я полностью согласен с этим.
Крис Джестер-Янг,
2
@Andy - ваша версия gcc может быть создана для предоставления -D_REENTRANTили -pthreadавтоматически. Запустите свою сборку, g++ -vи она выдаст много вывода о том, какие параметры на самом деле передает интерфейс компилятора, cc1plusи ld.
Tom
3
Здесь все еще есть вопрос, на который нет ответа: есть ли опасность не компилировать и не связываться с флагом -pthread - т.е. что на самом деле делает -pthread?
natenho
40

Откуда man gcc:

-pthread Добавляет поддержку многопоточности с библиотекой pthreads. Эта опция устанавливает флаги как для препроцессора, так и для компоновщика.

Дмитрий
источник