Jaka jest różnica między gcc -pthread
i gcc -lpthread
co jest używane podczas kompilowania programów wielowątkowych?
Jaka jest różnica między gcc -pthread
i gcc -lpthread
co jest używane podczas kompilowania programów wielowątkowych?
Odpowiedzi:
-pthread
informuje kompilator, aby połączyć się z biblioteką pthread, a także skonfigurować kompilację dla wątków.
Na przykład poniżej przedstawiono makra, które są definiowane, gdy -pthread
opcja zostanie użyta w pakiecie GCC zainstalowanym na moim komputerze z systemem Ubuntu:
$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1
Użycie tej -lpthread
opcji powoduje tylko połączenie biblioteki pthread - wstępnie zdefiniowane makra nie są definiowane.
Podsumowując: powinieneś skorzystać z tej -pthread
opcji.
Uwaga: -pthread
opcja jest udokumentowana jako opcja specyficzna dla platformy w dokumentacji GCC, więc nie zawsze może być dostępna. Jest jednak dostępny na platformach, dla których dokumentacja GCC nie podaje go wyraźnie (na przykład i386 i x86-64) - powinieneś go używać, gdy jest dostępny.
Zauważ również, że inne podobne opcje były używane przez GCC, takie jak -pthreads
(wymienione jako synonim dla -pthread
w Solaris 2) i -mthread
(dla obsługi wątków specyficznych dla MinGW w i386 i x86-64 Windows). Rozumiem, że GCC próbuje przejść na -pthread
jednolity rozwój.
-lpthread
wystarczy, aby uzyskać całą bibliotekę wątków POSIX.
-lpthread
nie dostać całą bibliotekę wątków POSIX.
-lpthread
powinno wystarczyć, aby uzyskać pełną obsługę pthreads. Żadne inne flagi kompilacji nie powinny być potrzebne.
-lpthread
ale nie -pthread
jest wystarczająca, aby uzyskać obsługę pthread, jak już wyjaśniłem w moim poprzednim komentarzu.
-lpthread
. Jednak dokumentacja gcc sugeruje, że może to być niewystarczające do uzyskania obsługi pthreads, o czym pisałem w poprzednich komentarzach. W ogóle mnie nie obchodzi, co się stanie, jeśli nie podasz -lpthread
lub nie udostępnisz przypadkowych innych zastrzeżonych opcji. Tylko -lpthread
jest określony przez POSIX do pthreads gwarancyjnych i że nie wydaje się być wystarczająca z gcc.
-pthread
Dodaje obsługę wielowątkowości z biblioteką pthreads. Ta opcja ustawia flagi zarówno dla preprocesora, jak i konsolidatora (man gcc
).
podczas
-lpthread
istnieje podczas łączenia, nie będzie żadnego wpływu na przetwarzanie wstępne.
Istnieje akceptowana odpowiedź, ale IMO nie zapewnia wystarczającego kontekstu i wglądu. Stąd ta dodatkowa odpowiedź.
-lpthread
jest rozwiązaniem problemu, który już nie istnieje (od ~ 2005 roku).
W dawnych czasach istniały zastrzeżone implementacje API Pthreads , które nie były zgodne z POSIX, jak LinuxThreads . Standard POSIX mówi po prostu, że jeśli ktoś chce zachowania zgodnego z POSIX, to musi łączyć się z -lpthread
implementacją API Pthreads zgodną z POSIX i linkować , które jest wymagane, jeśli istnieje wiele jej implementacji .
W nowoczesnych systemach operacyjnych nie ma wielu implementacji API Pthreads. I dlatego -lpthread
nie służy już żadnemu celowi.
Kompilatory takie jak gcc
i clang
(i prawdopodobnie wszystkie kompilatory kompatybilne z Linuksem) wymagają użycia -pthread
opcji wiersza poleceń zarówno do kompilowania, jak i łączenia zgodnych z POSIX aplikacji wielowątkowych i właśnie tego należy używać.
W czasie kompilacji -pthread
opcja pokazuje, że żądano API Pthread (może być wiele interfejsów API do obsługi wątków, np. Solaris Threads) i definiuje makra specyficzne dla platformy ( _REENTRANT
w systemie Linux , w systemie_MT
Solaris).
W czasie -pthread
dowiązania łącza w wymaganych bibliotekach (jeśli istnieją), które implementują zachowanie interfejsu API Pthreads zgodne z POSIX.
Powyższe wyjaśnia, dlaczego -lpthread
nie jest to ani konieczne, ani wystarczające.