2010-01-24 4 views
116

W różnych wielo-wątkowych projektach C i C++ widziałem flagę -pthread zastosowaną do etapu kompilowania i łączenia, podczas gdy inne nie używają go w ogóle i po prostu przekazują -lpthread do etapu łączenia .Znaczenie flagi -pthread podczas kompilowania

Czy istnieje jakiekolwiek niebezpieczeństwo, które nie powoduje kompilacji i łączenia z flagą -pthread - tzn. Co właściwie robi -pthread? Interesuję się głównie platformami Linux.

Odpowiedz

94

Spróbuj:

gcc -dumpspecs | grep pthread 

i szukać czegoś, który zaczyna się %{pthread:.

Na moim komputerze powoduje to kompilację plików za pomocą -D_REENTRANT i połączenie z -lpthread. Na innych platformach może się to różnić. Do większości przenośności należy używać -pthread.

Używanie _REENTRANT, na GNU libc, zmienia sposób działania niektórych nagłówków libc. Jako konkretny przykład wywołuje on wywołanie funkcji zwracającej lokację wątku lokalnego.

+3

Nie może to być po prostu "errno" i ogólne przetwarzanie. Nie jestem pewien, czy artykuł http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf jest w praktyce dla optymalizacji gcc, ale na pewno byłem pod wrażeniem głębi recenzji tam. –

+2

Nie sądzę, że przykład errno jest poprawny. Nawet bez zdefiniowania flagi -pthread lub _REENTRANT, moje errno.h (glibc 2.10.1) i gcc (4.4.1 na amd64) generują wywołanie dynamiczne do obsługi errno i nie łączą się z adresem symbolu. –

+0

@Andy: Właśnie zrobiłem grep dla '_REENTRANT' w'/usr/include'; Jestem pewien, że istnieją inne przykłady jego użycia. –

31

Od man gcc:

-pthread dodaje wsparcie dla wielowątkowości z pthreads bibliotecznych. Ta opcja ustawia flagi dla preprocesora i łącznika.