我有一個可以由多個線程創建的類。但是在一個函數中需要保護代碼,所以我決定使用boost進程間互斥。每個班級創建或在它的構造函數打開同一個互斥:Boost named_mutex和remove()命令
MyClass::MyClass()
{
boost::interprocess::named_mutex m_Lock(
boost::interprocess::open_or_create, "myLock");
}
所以現在來這裏的關鍵代碼部分被稱爲點:
int MyClass::MyFunction()
{
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
m_Lock, boost::interprocess::try_to_lock);
if(!lock)
{
return -1;
}
// else do some stuff here
}
給函數清理乾淨後(和喜歡它升壓頁中介紹)我在類析構函數使用remove命令:
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
其實這一切的代碼工作正常,但有一個關心我:
正如它在刪除命令的描述是說:
擦除從系統中命名的mutex。錯誤返回false。永遠不會拋出。
因此,這意味着刪除命令只是從系統中刪除互斥體 - 即使另一個線程剛剛鎖定它(我已經試過這種情況 - 它不再鎖定)。 所以我的問題如下: 例如我有3個線程(A,B和C) - 現在將出現以下情況:
- 方法A創建該類的一個實例,調用函數,並鎖定它
- 方法B創建該類的一個實例,調用該函數,但不能訪問代碼(隨後等待例如)
- 方法A與受保護的代碼完成和它被解鎖
- 方法B獲得對受保護的代碼並鎖定它
- 過程s A刪除類的實例 - >刪除命令被調用
- 進程C創建類的實例,調用該函數並可以訪問代碼,因爲remove命令刪除了Mutex - > Error!
所以現在有人可能會說「那麼不要刪除!」 - 那可能嗎?我的意思是自named_mutex寫入系統後,我懷疑它沒有明確的調用就被擦除,即使程序結束。 任何人都有一些幫助?
我很困惑你的問題和術語「線程」和「過程」的相互使用。你在打哪個?線程?或進程?如果你只在一個單獨的進程中使用多線程,那麼命名的模式通常具有非常小的效用。 –
對此感到抱歉 - 寫作時我有點兒困惑。其實我有不同的過程。正如你所說的,只有線程不需要命名互斥體。 – Toby