簡體   English   中英

在已經鎖定的pthread_mutex_t上執行pthread_mutex_init時會發生什么?

[英]What happens when I do a pthread_mutex_init on an already locked pthread_mutex_t?

我的互斥鎖類定義為:

class Mutex{
    static pthread_mutex_t mutex;
public:
    Mutex(){
        pthread_mutex_init(&mutex, NULL);
        while(pthread_mutex_trylock(&mutex)){
            sleep(2000);
        }
    }
    virtual ~Mutex(){
        pthread_mutex_unlock(&mutex);
        pthread_mutex_destroy(&mutex);
    }
};

我正在嘗試使用互斥的函數來使用此類,例如:

void doSomething(){
    Mutex mutex;
    // do something
}

這樣,在調用構造函數時,互斥量將被初始化,並嘗試獲取該互斥量的鎖。 並且當它超出該功能的范圍時,它將自動被銷毀。

但是,如果一個線程在互斥鎖上有一個鎖,則另一個線程嘗試在該線程上運行pthread_mutex_init ,究竟發生了什么? 具有鎖的線程會被覆蓋嗎?

POSIX.1-2013開始非常簡單:

嘗試初始化已經初始化的互斥鎖會導致未定義的行為。

這就是為什么您有另一種初始化互斥鎖的方法:

// in your .cpp somewhere
pthread_mutex_t Mutex::mutex = PTHREAD_MUTEX_INITIALIZER;

除此之外,從邏輯上講,您的課程似乎非常有問題。 您是否真的想為Mutex所有用戶使用一個全局鎖,而不管他們在做什么? 您應該使用細粒度的鎖,否則將通過軟件鎖定人為地限制自己的可伸縮性。

暫無
暫無

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

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