Tôi đã làm việc trên một dự án sở thích, nơi mutexes đã được hành xử bí ẩn. Tôi đun sôi nó xuống trường hợp thử nghiệm này rõ ràng là nên bế tắc.Tại sao liên kết gcc không có cờ lpthread?
#include <pthread.h>
#include <stdio.h>
int main() {
pthread_mutex_t test;
pthread_mutex_init(&test, NULL);
pthread_mutex_lock(&test);
pthread_mutex_lock(&test);
printf("Took lock twice\n");
return 0;
}
Tuy nhiên, khi tôi biên dịch mà không có sự -lpthread
cờ, không chỉ chương trình vẫn biên dịch và liên kết, nó cũng chạy mà không deadlocking. Tại sao?
gcc pthread_break.c -o pthread_test
./pthread_test
Took lock twice
Biên soạn với -lpthread
cờ mang lại kết quả mong đợi:
gcc pthread_break.c -o pthread_test -lpthread
./pthread_test
<- deadlocked here
Tôi đang chạy phiên bản GCC 7.2.0.
Bản sao có thể có của [là pthread trong glibc.so được thực hiện bởi biểu tượng yếu để cung cấp chức năng stubread stub?] (Https://stackoverflow.com/questions/21092601/is-pthread-in-glibc-so-implemented-by -weak-symbol-to-offer-pthread-stub-functi) – Lanting
Câu trả lời liên quan nhưng không phải là câu hỏi trùng lặp. –
Bạn đang sử dụng nền tảng nào? Có thể thư viện chuẩn chứa các hàm Pthread hoặc các phiên bản giả luôn báo cáo lỗi "chưa được thực hiện". Bạn có kiểm tra cẩn thận mọi mã thoát và báo cáo lỗi cẩn thận không? –