2015-06-11 126 views
1

我在共享內存上使用進程共享pthread_mutex_t。我想知道如果一個進程鎖定互斥鎖並以某種方式退出,會發生什麼?正如我的實驗所示,僵局發生了,但這是一個壞消息。那麼有沒有辦法來防止這種情況?流程退出時不應該自動解鎖互斥鎖?pthread進程共享互斥死鎖

回答

2

不,不應該自動解鎖互斥鎖,因爲受互斥鎖保護的共享數據可能處於不一致的狀態。

如果你想處理這種情況,你需要使用「健壯的互斥體」。要創建一個強大的互斥鎖,通過在pthread_mutexattr_t對象上使用pthread_mutexattr_setrobust()將互斥鎖健壯性屬性設置爲PTHREAD_MUTEX_ROBUST,該對象用於初始化互斥鎖。

如果一個線程或進程在持有可靠的互斥體時退出,則該互斥體的下一個pthread_mutex_lock()調用將返回EOWNERDEAD錯誤。如果返回此錯誤,您的代碼必須仔細檢查由互斥鎖保護的所有共享狀態並修復任何不一致。然後,它可以通過在互斥鎖上調用pthread_mutex_consistent()將狀態標記爲一致,然後像平常一樣繼續執行它。

+0

我在macos 10.10.3上找不到pthread_mutexattr_setrobust。這是一項新功能嗎? –

+0

我發現這個功能在linux上是支持的,對我來說就夠了,謝謝 –