Znaczenie flagi -pthread podczas kompilacji


143

W różnych wielowątkowych projektach C i C ++ widziałem -pthreadflagę stosowaną zarówno na etapie kompilacji, jak i linkowania, podczas gdy inne w ogóle jej nie używają i po prostu przechodzą -lpthreaddo etapu łączenia.

Czy istnieje niebezpieczeństwo niekompilowania i linkowania z -pthreadflagą - czyli co -pthreadwłaściwie robi? Interesują mnie przede wszystkim platformy Linux.

Odpowiedzi:


107

Próbować:

gcc -dumpspecs | grep pthread

i poszukaj wszystkiego, co się zaczyna %{pthread: .

Na moim komputerze powoduje to kompilowanie plików -D_REENTRANTi łączenie z nimi -lpthread. Na innych platformach może się to różnić. Używaj -pthreaddla większości przenośnych.

Używanie _REENTRANTna GNU libc zmienia sposób działania niektórych nagłówków libc. W konkretnym przykładzie errnowywołuje funkcję zwracającą lokalną lokalizację wątku.


3
Może to nie być tylko errnoi ogólnie przetwarzanie wstępne. Nie jestem pewien, jak trafny jest artykuł hpl.hp.com/techreports/2004/HPL-2004-209.pdf w praktyce dla optymalizacji gcc, ale z pewnością byłem pod wrażeniem głębokości tamtej recenzji.
Pascal Cuoq

2
Nie sądzę, aby przykład errno był poprawny. Nawet bez flagi -pthread lub definicji _REENTRANT, moje errno.h (glibc 2.10.1) i gcc (4.4.1 na amd64) generują dynamiczne wywołanie do obsługi errno i nie łączy się z adresem symbolu.
Andy Ross

1
@ Pascal: Dzięki za link. W tej chwili przebiega to trochę ponad moją głową, ale wydaje się, że głównym punktem jest to, że wątków nie można po prostu „przyczepić”, ale zamiast tego należy je zaprojektować jako część modelu pamięci. Całkowicie się z tym zgadzam.
Chris Jester-Young

2
@Andy - Twoja wersja gcc może być zbudowana tak, aby zapewniała -D_REENTRANTlub -pthreadautomatycznie. Uruchom kompilację z, g++ -va zrzuci wiele danych wyjściowych na temat parametrów, do których interfejs kompilatora faktycznie przekazuje cc1plusi ld.
Tom

3
Wciąż jest tu pytanie, na które nie ma odpowiedzi: Czy istnieje niebezpieczeństwo niekompilowania i linkowania z flagą -pthread - tj. Co właściwie robi -pthread?
natenho

40

Od man gcc:

-pthread Dodaje obsługę wielowątkowości z biblioteką pthreads. Ta opcja ustawia flagi zarówno dla preprocesora, jak i konsolidatora.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.