簡體   English   中英

為什么我在同一個線程中使用 pthread_mutex_lock 兩次時沒有發生核心轉儲?

[英]Why has no core dump occurred when I use pthread_mutex_lock twice in the same thread?

#include <pthread.h>
#include <iostream>

int main()
{
    pthread_mutex_t mtx;
    pthread_mutex_init(&mtx, NULL);
    pthread_mutex_lock(&mtx);
    pthread_mutex_lock(&mtx);
    return 0;
}

我在 Centos 7 中運行此代碼,我除了有一個核心轉儲文件,但它沒有,程序只是死在命令行中。

我以為 pthread 互斥鎖默認是非遞歸互斥鎖,我的程序中只有一個線程,所以當我兩次鎖定這個互斥鎖時,它應該是崩潰的。

當 go 出錯時,您不能保證核心轉儲。 有一些錯誤,例如取消引用 null 指針,linux 選擇捕獲並為您提供核心轉儲文件(在正確的模式下),但不能保證。 事實上,很多邏輯錯誤都無法檢測到,因此無法確定是否需要轉儲。

在兩次鎖定互斥體的情況下,這是“未定義的行為”,這意味着庫保證會發生什么。 在互斥鎖的特殊情況下,可以深入研究實現以了解更多關於該特定實現如何處理它的信息。

但是,總的來說,值得注意的是 pthreads 中有一個可重入互斥鎖,其唯一工作是在線程鎖定互斥鎖兩次時提供正常行為。 鑒於 pthreads 開發人員認為需要同時提供可重入和不可重入互斥鎖,這表明可以對互斥鎖進行一些優化,這些優化只有在線程不將其鎖定兩次時才是安全的。

在這種情況下,看起來您的庫可能使用了一種鎖定方案,該方案不知道哪個線程進行了鎖定。 因此,當您第二次鎖定它時,它並沒有意識到該線程已經鎖定它,而是平靜地等待線程自行解鎖。

如果您嘗試在一個線程上鎖定互斥鎖並在另一個線程上解鎖它,則會發生一組相關的奇怪行為(如果您需要此行為,請改用信號量)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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