У чому відмінність 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. Цей параметр встановлює прапори як для препроцесора, так і для Linker ( man gcc
).
поки
-lpthread
існує під час з'єднання, під час попередньої обробки не буде впливу.
Відповідь є прийнятою, але, IMO, вона не дає достатнього контексту та розуміння. Звідси ця додаткова відповідь.
-lpthread
є рішенням проблеми, яка більше не існує (з ~ 2005 р.).
За старих часів існували власні реалізації Pthreads API, які не відповідали POSIX, як LinuxThreads . Стандарт POSIX просто говорить, що якщо хочеться поведінки, сумісної з POSIX, то потрібно зв’язатись -lpthread
і зв’язати, що потрібно для з'єднання сумісної з POSIX реалізації Pthreads API, якщо його буде багато реалізацій .
Немає декількох реалізацій API Pthreads в сучасних операційних системах. І тому -lpthread
більше не служить ніякій меті.
Такі компілятори, як gcc
і clang
(і, мабуть, всі сумісні з Linux компілятори) вимагають використання -pthread
параметра командного рядка як для компіляції, так і для з'єднання багатопотокових програм, сумісних з POSIX, і для цього потрібно використовувати.
Під час компіляції -pthread
параметр виявляє, що запитується API Pthread (може бути декілька API інтерфейсу, наприклад, Solaris Threads) та визначає макроси, орієнтовані на платформу ( _REENTRANT
в Linux , _MT
на Solaris).
У час -pthread
посилання посилання в потрібних бібліотеках (якщо такі є), які реалізують сумісну з POSIX поведінку API Pthreads.
Сказане чітко пояснює, чому -lpthread
не є ні необхідним, ні достатнім.