В чем разница между gcc -pthread
и gcc -lpthread
что используется при компиляции многопоточных программ?
multithreading
gcc
thread-safety
pthreads
compiler-flags
Вишнурадж V
источник
источник
Ответы:
-pthread
сообщает компилятору ссылку на библиотеку pthread, а также настройку компиляции для потоков.Например, ниже показаны макросы, которые определяются, когда
-pthread
опция используется в пакете GCC, установленном на моем компьютере с Ubuntu:Использование этой
-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
andclang
(и, вероятно, все Linux-совместимые компиляторы) требуют использования параметра-pthread
командной строки как для компиляции, так и для компоновки POSIX-совместимых многопоточных приложений, и это то, что нужно использовать.Во время компиляции
-pthread
опция показывает, что запрошен Pthread API (может быть несколько потоковых API, например, Solaris Threads) и определяет макросы для конкретной платформы (_REENTRANT
в Linux ,_MT
в Solaris).Во время компоновки
-pthread
ссылки в необходимых библиотеках (если есть), которые реализуют POSIX-совместимое поведение Pthreads API.Из вышесказанного ясно, почему
-lpthread
это не является ни необходимым, ни достаточным.источник