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

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

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

Ответы на вопрос(2)

man gcc

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

Решение Вопроса

Пытаться:

gcc -dumpspecs | grep pthread

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

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

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

 Chris Jester-Young24 янв. 2010 г., 18:43
@Pascal: Спасибо за ссылку. В данный момент он стоит немного выше моей головы, но, похоже, центральным моментом является то, что многопоточность не может быть простоприкрепленный, но вместо этого должны быть разработаны как часть модели памяти. Я полностью согласен с этим.
 user202337031 авг. 2018 г., 13:19
Как я могу найти, если проекту нужен-pthread флаг?
 Andy Ross25 янв. 2010 г., 06:27
Я знаю, как это можно сделать, чтобы работать. Я просто возился с примером, который неверен (по крайней мере) в Ubuntu 9.10, что подтверждается проверкой сгенерированной сборки. Насколько я могу судить, типичная сборка glibc рассматривает -pthread как синоним с -lpthread.
 natenho14 июл. 2015 г., 17:43
Там'Здесь все еще остается вопрос, на который не дан ответ: есть ли опасность не компилировать и связывать с флагом -pthread - то есть, что на самом деле делает -pthread?
 Tom24 янв. 2010 г., 19:51
@Andy - ваша версия gcc может быть построена для обеспечения-D_REENTRANT или же-pthread автоматически. Запустите свою сборку сg++ -v и он будет выводить много информации о том, на какие параметры передается интерфейс компилятораcc1plus а также .ld
 Chris Jester-Young14 июл. 2015 г., 17:46
@natenho-pthread делает разные вещи на разных платформах, но все они, так или иначе, позволяют работать pthreads. Итак, опуская-pthread может привести к тому, что pthreads не будет работать (или работать ненадежно), или он может ничего не делать для платформ, на которых уже включена поддержка pthreads.
 Andy Ross24 янв. 2010 г., 17:56
Я неНе думаю, что ошибочный пример верен. Даже без флага -pthread или определения _REENTRANT, мои errno.h (glibc 2.10.1) и gcc (4.4.1 на amd64) генерируют динамический вызов для обработки errno и не делаютt ссылка на адрес символа.
 Chris Jester-Young24 янв. 2010 г., 18:39
@Andy: я только что сделал grep для_REENTRANT в/usr/include; Я'Я уверен, что есть и другие примеры его использования.
 Kaz10 авг. 2017 г., 02:13
Библиотека GNU C не нужна-D_REENTRANT и поэтому-pthread поскольку, я думаю, по крайней мере, еще в 2000 году. Все необходимое переключение между однопоточной и многопоточной операциями в glibc зависит от наличия или отсутствияlibpthread библиотека. Никакой код, включающий заголовки библиотеки, не нужно перекомпилировать.
 Pascal Cuoq24 янв. 2010 г., 17:53
Это может быть не простоerrno и предварительная обработка в целом. Я'Я не уверен, насколько актуальна статьяhpl.hp.com/techreports/2004/HPL-2004-209.pdf на практике для оптимизации gcc, но я уверен, что был впечатлен глубиной обзора там.

Ваш ответ на вопрос