В чем разница между gcc -pthread
и gcc -lpthread
что используется при компиляции многопоточных программ?
В чем разница между gcc -pthread
и gcc -lpthread
что используется при компиляции многопоточных программ?
Ответы:
-pthread
сообщает компилятору ссылку на библиотеку pthread, а также настройку компиляции для потоков.
Например, ниже показаны макросы, которые определяются, когда -pthread
опция используется в пакете GCC, установленном на моем компьютере с 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
Использование этой -lpthread
опции приводит только к связыванию библиотеки pthread - предопределенные макросы не определяются.
Итог: вы должны использовать -pthread
опцию.
Примечание: эта -pthread
опция задокументирована как опция для конкретной платформы в документации GCC, поэтому она не всегда может быть доступна. Однако он доступен на платформах, для которых в документации GCC он явно не указан (например, i386 и x86-64) - вы должны использовать его, когда он доступен.
Также обратите внимание, что GCC использовал другие аналогичные параметры, такие как -pthreads
(указано как синоним для -pthread
Solaris 2) и -mthread
(для поддержки потоков, специфичных для MinGW, в i386 и x86-64 Windows). Насколько я понимаю, GCC пытается перейти к -pthread
единообразному использованию .
-lpthread
достаточно, чтобы получить всю библиотеку потоков POSIX.
-lpthread
действительно получает всю библиотеку потоков POSIX.
-lpthread
должно быть достаточно, чтобы получить полную поддержку pthreads. Никаких других флагов компиляции не требуется.
-lpthread
но не -pthread
недостаточна для получения поддержки pthread, как я уже пояснил в своем предыдущем комментарии.
-lpthread
. Однако документация gcc предполагает, что этого может быть недостаточно для поддержки pthreads, о чем я и говорил в предыдущих комментариях. Меня совершенно не волнует, что произойдет, если вы не предоставите -lpthread
какие-либо другие проприетарные опции. Только -lpthread
указано в POSIX для гарантии pthreads, а с gcc этого недостаточно.
-pthread
Добавляет поддержку многопоточности с библиотекой pthreads. Эта опция устанавливает флаги как для препроцессора, так и для компоновщика ( man gcc
).
пока
-lpthread
существует во время связывания, во время предварительной обработки не будет никакого влияния.
Есть принятый ответ, но, ИМО, он не дает достаточного контекста и понимания. Отсюда этот дополнительный ответ.
-lpthread
это решение проблемы, которой больше не существует (с ~ 2005 г.).
Раньше существовали проприетарные реализации Pthreads API , которые не были совместимы с POSIX, например LinuxThreads . Стандарт POSIX просто говорит, что если кто-то хочет POSIX-совместимого поведения, то он должен связываться с -lpthread
POSIX-совместимой реализацией Pthreads API и связываться с ней, если будет много его реализаций .
В современных операционных системах нет множественных реализаций API Pthreads. И поэтому -lpthread
больше не служит никакой цели.
Такие компиляторы, как gcc
and clang
(и, вероятно, все Linux-совместимые компиляторы) требуют использования параметра -pthread
командной строки как для компиляции, так и для компоновки POSIX-совместимых многопоточных приложений, и это то, что нужно использовать.
Во время компиляции -pthread
опция показывает, что запрошен Pthread API (может быть несколько потоковых API, например, Solaris Threads) и определяет макросы для конкретной платформы ( _REENTRANT
в Linux , _MT
в Solaris).
Во время компоновки -pthread
ссылки в необходимых библиотеках (если есть), которые реализуют POSIX-совместимое поведение Pthreads API.
Из вышесказанного ясно, почему -lpthread
это не является ни необходимым, ни достаточным.