Sự khác biệt giữa gcc -pthread
và gcc -lpthread
cái nào được sử dụng khi biên dịch các chương trình đa luồng?
Sự khác biệt giữa gcc -pthread
và gcc -lpthread
cái nào được sử dụng khi biên dịch các chương trình đa luồng?
Câu trả lời:
-pthread
yêu cầu trình biên dịch liên kết trong thư viện pthread cũng như cấu hình biên dịch cho các luồng.
Ví dụ: phần sau hiển thị các macro được xác định khi -pthread
tùy chọn được sử dụng trên gói GCC được cài đặt trên máy Ubuntu của tôi:
$ 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
Việc sử dụng -lpthread
tùy chọn này chỉ khiến thư viện pthread được liên kết - các macro được xác định trước không được xác định.
Điểm mấu chốt: bạn nên sử dụng -pthread
tùy chọn.
Lưu ý: -pthread
tùy chọn này được ghi lại dưới dạng tùy chọn nền tảng cụ thể trong tài liệu GCC, vì vậy, nó có thể không phải lúc nào cũng có sẵn. Tuy nhiên, nó có sẵn trên các nền tảng mà tài liệu GCC không liệt kê rõ ràng nó (chẳng hạn như i386 và x86-64) - bạn nên sử dụng nó khi có sẵn.
Cũng lưu ý rằng các tùy chọn tương tự khác đã được GCC sử dụng, chẳng hạn như -pthreads
(được liệt kê là từ đồng nghĩa với -pthread
trên Solaris 2) và -mthread
(hỗ trợ luồng dành riêng cho MinGW trên i386 và x86-64 Windows). Tôi hiểu rằng GCC đang cố gắng chuyển sang sử dụng -pthread
thống nhất trong tương lai.
-lpthread
là đủ để nhận toàn bộ thư viện phân luồng POSIX.
-lpthread
không nhận được toàn bộ thư viện luồng POSIX.
-lpthread
phải là đủ để nhận được hỗ trợ pthreads đầy đủ. Không cần cờ biên dịch khác.
-lpthread
nhưng không phải -pthread
là không đủ để nhận được hỗ trợ pthread, như tôi đã làm rõ trong nhận xét trước của mình.
-lpthread
. Tuy nhiên, tài liệu gcc cho thấy rằng điều này có thể không đủ để nhận được sự hỗ trợ của pthreads, đó là điểm tôi đã thực hiện qua các nhận xét trước. Tôi hoàn toàn không quan tâm đến điều gì sẽ xảy ra nếu bạn không cung cấp -lpthread
hoặc một số tùy chọn độc quyền ngẫu nhiên khác. Chỉ -lpthread
được chỉ định bởi POSIX để đảm bảo pthreads và điều đó dường như không đủ với gcc.
-pthread
Thêm hỗ trợ cho đa luồng với thư viện pthreads. Tùy chọn này đặt cờ cho cả bộ tiền xử lý và bộ liên kết ( man gcc
).
trong khi
-lpthread
tồn tại trong khi liên kết sẽ không có ảnh hưởng trong khi xử lý trước.
Có một câu trả lời được chấp nhận, nhưng IMO, nó không cung cấp đủ ngữ cảnh và thông tin chi tiết. Do đó câu trả lời bổ sung này.
-lpthread
là một giải pháp cho một vấn đề không còn tồn tại (kể từ năm 2005).
Ngày xưa, đã có những triển khai độc quyền của API Pthreads không tuân theo POSIX, như LinuxThreads . Tiêu chuẩn POSIX chỉ đơn thuần nói rằng nếu một người muốn hành vi tuân thủ POSIX, thì người đó phải liên kết với -lpthread
và liên kết được yêu cầu để liên kết việc triển khai tuân thủ POSIX của API Pthreads, nếu có nhiều triển khai của nó .
Không có nhiều triển khai API Pthreads trong các hệ điều hành hiện đại. Và đó là lý do tại sao -lpthread
không còn phục vụ bất kỳ mục đích nào.
Các trình biên dịch như gcc
và clang
(và có thể là tất cả các trình biên dịch tương thích với Linux) yêu cầu sử dụng -pthread
tùy chọn dòng lệnh cho cả việc biên dịch và liên kết các ứng dụng đa luồng tuân thủ POSIX và đó là những gì người ta phải sử dụng.
Tại thời điểm biên dịch, -pthread
tùy chọn biểu thị rằng API Pthread được yêu cầu (có thể có nhiều API phân luồng, ví dụ: Solaris Threads) và xác định các macro dành riêng cho nền tảng ( _REENTRANT
trên Linux , _MT
trên Solaris).
Tại thời điểm liên kết, -pthread
các liên kết trong thư viện bắt buộc (nếu có) triển khai hành vi API Pthreads tuân thủ POSIX.
Phần trên làm rõ lý do tại sao -lpthread
không cần thiết cũng không đủ.