Значення прапорця -низу при компілюванні


143

У різних багатопотокових проектах C і C ++ я бачив -pthread прапор застосовується як до етапу компіляції, так і для зв'язування, а інші взагалі не використовують його і просто переходять -lpthreadна етап зв’язку.

Чи є якась небезпека не скласти та зв’язати -pthreadпрапор - тобто що -pthreadнасправді робить? Мене насамперед цікавлять платформи Linux.

Відповіді:


107

Спробуйте:

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) генерує динамічний виклик для обробки помилок і не посилається на адресу символу.
Енді Росс,

1
@Pascal: Дякую за посилання. Наразі це трохи вище моєї голови, але здається, що центральним моментом є те, що нарізання різьби не може бути просто «зачеплено», а натомість має бути розроблене як частина моделі пам'яті. Я з цим повністю згоден.
Кріс Єстер-Янг

2
@Andy - Ваша версія gcc може бути створена для надання -D_REENTRANTабо -pthreadавтоматичної. Запустіть свою збірку, g++ -vі це дозволить скинути багато результатів щодо того, які параметри компілятора переходять на cc1plusі до ld.
Том

3
Тут все ще немає відповіді на запитання: чи існує небезпека не скласти та зв’язати прапор -pthread - тобто що насправді робить -pthread?
natenho

40

Від man gcc:

-pthread Додає підтримку багатопотокових читань з бібліотекою pthreads. Цей параметр встановлює прапори як для препроцесора, так і для лінкера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.