Jaka jest różnica między gcc -pthread
i gcc -lpthread
co jest używane podczas kompilowania programów wielowątkowych?
multithreading
gcc
thread-safety
pthreads
compiler-flags
Vishnuraj V
źródło
źródło
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: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.źródło
-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.źródło
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
iclang
(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.źródło