[英]Why does gcc link without the lpthread flag?
我正在開展一個業余愛好項目,其中互斥體表現得很神秘。 我把它歸結為這個應該明顯陷入僵局的測試用例。
#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;
}
但是,當我在沒有-lpthread
標志的情況下編譯時,不僅程序仍然可以編譯和鏈接,它還可以在沒有死鎖的情況下運行。 為什么?
gcc pthread_break.c -o pthread_test
./pthread_test
Took lock twice
使用-lpthread
標志進行編譯會產生預期結果:
gcc pthread_break.c -o pthread_test -lpthread
./pthread_test
<- deadlocked here
我正在運行GCC 7.2.0版。
問題似乎缺乏信息 - 但似乎有兩種選擇:
首先,使用PTHREAD_MUTEX_RECURSIVE
啟動互斥鎖,這將允許對互斥鎖進行雙重鎖定 - 管理引用計數,並且僅當引用計數為0時才釋放互斥鎖。這意味着可以在同一個線程中多次鎖定相同的互斥鎖,但為了釋放它,必須提供相同數量的解鎖。
第二個是,此版本中的gcc僅為pthread
函數實現存根 - 這意味着如果不添加-lpthread
庫鏈接指令,則不會實現鎖定函數。 這一點得到以下事實的支持:添加選項后,會出現死鎖。
我將嘗試通過GCC源代碼來驗證這確實是第二個選項的結果 - 將添加更新。
注意:始終建議專門鏈接庫,因為它允許控制結果 - GCC內部支持的回退可能導致意外行為,如上所示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.