簡體   English   中英

為什么沒有lpthread標志的gcc鏈接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM