[英]Threads trying to acquire pthread_mutex_lock(&mutex) What happens if they don't get the lock?
[英]What happens if a thread doesn't succeed when making a pthread_mutex_lock() call?
我正在做一個實驗,我認為這是可以保證的死鎖情況:
void *thread_1(void *vptr)
{
pthread_mutex_lock(&a);
sleep(1);
pthread_mutex_lock(&b);
pthread_mutex_unlock(&b);
pthread_mutex_unlock(&a);
}
void *thread_2(void *vptr)
{
pthread_mutex_lock(&b);
sleep(1);
pthread_mutex_lock(&a);
pthread_mutex_unlock(&a);
pthread_mutex_unlock(&b);
}
如果線程無法鎖定怎么辦? 它是否進入隊列,等待互斥,還是只是繼續執行下一條指令?
在您的情況下,兩個線程將永遠掛起,等待互斥。 如果您同時啟動兩個線程。
為什么不創建互斥對象和線程,然后運行示例?
如果一個線程試圖鎖定已被另一個線程鎖定的互斥鎖,它將被掛起。 在這種情況下,只有獲得了鎖,它的執行才會繼續。 (盡管沒有“隊列”-只是一組無序的等待線程。 任何等待線程都可以成為下一個獲取互斥鎖的線程)。
如果線程試圖鎖定已被自身鎖定或未正確初始化的互斥鎖,則pthread_mutex_lock()
可能返回非零錯誤代碼,並且執行將繼續進行 ,而不會獲取該互斥鎖。
這取決於它無法鎖定的原因。 例如,如果線程已持有鎖,則可能返回錯誤。 無論如何,您應該檢查返回值,並檢查手冊頁中errno
中返回的錯誤代碼。 我的(linux)指出:
The pthread_mutex_lock() function may fail if: EDEADLK The current thread already owns the mutex.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.