2016-04-25 76 views
0

我的互斥體類的定義: -當我在已經鎖定的pthread_mutex_t上執行pthread_mutex_init時會發生什麼?

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,究竟發生了什麼?具有鎖的線程是否會被覆蓋?

+1

鼻惡,當然。 –

+0

未定義的行爲。答案是簡短回答:)) – tty6

+0

我試圖弄清楚從這個實現中可能會有哪些可能的好處,但我找不到任何東西。另外,除非你仍然在pre-C++ 11-land中,否則我不會看到沒有任何地球或其他理由不使用['std :: mutex'](http://en.cppreference.com/w/cpp/thread/mutex)和線程支持庫的其餘產品。 – WhozCraig

回答

5

很簡單,從POSIX.1-2013

試圖初始化未定義的行爲已經初始化的互斥結果。

這就是爲什麼你必須初始化互斥的另一種方式:

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

除此之外,從邏輯上來說,你的類看起來很可疑。你真的想要一個全球鎖Mutex的所有用戶,無論他們在做什麼?你應該使用細密的鎖,否則你會通過software lockout人爲地限制你自己的可擴展性。

+0

這只是一個互斥的例子,我提出了將被該程序的一小部分使用。它*需要*對此實現具有全局鎖定。 –

相關問題