Ý nghĩa của cờ -pthread khi biên dịch


143

Trong các dự án C và C ++ đa luồng khác nhau, tôi đã thấy -pthreadcờ được áp dụng cho cả giai đoạn biên dịch và liên kết trong khi các dự án khác hoàn toàn không sử dụng nó và chỉ chuyển -lpthreadsang giai đoạn liên kết.

Có bất kỳ nguy hiểm nào không biên dịch và liên kết với -pthreadcờ - tức là những gì -pthreadthực sự làm? Tôi chủ yếu quan tâm đến các nền tảng Linux.

Câu trả lời:


107

Thử:

gcc -dumpspecs | grep pthread

và tìm kiếm bất cứ điều gì bắt đầu với %{pthread:.

Trên máy tính của tôi, điều này khiến các tệp được biên dịch -D_REENTRANTvà liên kết với -lpthread. Trên các nền tảng khác, điều này có thể khác nhau. Sử dụng -pthreadcho hầu hết các tính di động.

Sử dụng _REENTRANT, trên GNU libc, thay đổi cách một số tiêu đề libc hoạt động. Như một ví dụ cụ thể, nó thực hiện errnocuộc gọi một hàm trả về một vị trí luồng-luồng.


3
Nó có thể không chỉ errnovà tiền xử lý nói chung. Tôi không chắc bài viết hpl.hp.com/techreports/2004/HPL-2004-209.pdf có liên quan như thế nào trong thực tế để tối ưu hóa gcc, nhưng tôi chắc chắn đã bị ấn tượng bởi độ sâu của bài đánh giá ở đó.
Pascal Cuoq

2
Tôi không nghĩ rằng ví dụ errno là chính xác. Ngay cả khi không có cờ -pthread hoặc _REENTRANT xác định, errno.h (glibc 2.10.1) và gcc (4.4.1 trên amd64) của tôi tạo ra một lệnh gọi động để xử lý errno và không liên kết với địa chỉ ký hiệu.
Andy Ross

1
@Pascal: Cảm ơn đã liên kết. Nó đi lên trên đầu tôi một chút vào lúc này, nhưng có vẻ như điểm trung tâm là việc xâu chuỗi không thể chỉ là "giải quyết" mà thay vào đó phải được thiết kế như một phần của mô hình bộ nhớ. Tôi hoàn toàn đồng ý với điều đó.
Chris Jester-Young

2
@Andy - phiên bản gcc của bạn có thể được xây dựng để cung cấp -D_REENTRANThoặc -pthreadtự động. Chạy bản dựng của bạn với g++ -vvà nó sẽ kết xuất rất nhiều đầu ra về các tham số mà giao diện người biên dịch thực sự truyền đến cc1plusld.
Tom

3
Vẫn còn một câu hỏi chưa được trả lời ở đây: Có bất kỳ nguy hiểm nào không được biên dịch và liên kết với cờ -pthread - tức là -pthread thực sự làm gì?
natenho 14/07/2015

40

Từ man 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à trình liên kết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.