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