2010-01-24 2 views
116

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

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

ответ

94

Try:

gcc -dumpspecs | grep pthread 

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

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

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

+3

Это может быть не просто «ошибка» и предварительная обработка в целом. Я не уверен, насколько актуальна статья http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf на практике для gcc-оптимизаций, но я был уверен в глубине обзора там. –

+2

Я не думаю, что пример errno правильный. Даже без флага -pthread или _REENTRANT define my errno.h (glibc 2.10.1) и gcc (4.4.1 на amd64) генерирует динамический вызов для обработки errno и не связывается с адресом символа. –

+0

@ Andy: Я просто сделал grep для '_REENTRANT' в'/usr/include'; Я уверен, что есть другие примеры его использования. –

31

От man gcc:

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