2011-12-14 71 views
0

我正在使用boost::interprocess::named_upgradable_mutex來同步幾個進程。interprocess :: named_upgradable_mutex - 如果進程死亡仍然鎖定

我使用boost::interprocess::sharable_lockboost::interprocess::scoped_lock來鎖定互斥鎖。

測試同步時,只要進程正常工作並且正常關閉,就會顯示正常。

但是,我注意到,如果一個進程在保持互斥體時被殺死(例如通過TaskManager),互斥鎖將保持鎖定狀態。

任何想法如何我可以處理過程失敗?

我想過使用timed_lock()以防萬一......其他想法?

+0

在哪種情況下可以殺死一個進程,從而使整個程序實例被殺死? – curiousguy 2011-12-15 02:08:45

+0

[boost進程間命名互斥鎖的可能重複仍然收購後崩潰](http://stackoverflow.com/questions/7808431/boost-interprocess-named-mutex-remains-acquired-after-a-crash) – 2011-12-15 02:16:12

回答

0

你正在研究症狀而不是問題。互斥體的目的是允許進程或線程將共享數據置於不一致的狀態。如果進程在保持互斥體時死亡,共享數據仍處於不一致狀態。問題是如何將共享數據返回到一致狀態,而不是如何解鎖互斥鎖。

當您將共享數據返回到一致狀態時,請在您返回到一致狀態的數據中包含互斥鎖或鎖。最簡單的方法是刪除現有的鎖並創建一個新的鎖。您可能必須爲共享數據做同樣的事情。

如果你真的需要這樣做,我建議你可能沒有使用正確的工具來完成這項工作。

1

如果您因某種原因殺死您的應用,您可以通過從Windows註銷或執行命令mutex.unlock()來解鎖此鎖定。