如果我有兩個關鍵部分,并且我制作了兩個對應的互斥鎖來保護它們中的每一個。(我認為有必要精確控制何時鎖定,因為它們在不同的時間和場景中使用,Q1:真的是這樣嗎?)例如:
bool a;//ignore atomic_bool, because in actual, the data structure is more complex
mutex mut_a;//for threadsafe of a
bool b;
mutex mut_b;//for threadsafe of b
我需要實作這種邏輯:
if (lock_guard<mutex> lck(mut_a);a) { do something...
}
else {
if (lock_guard<mutex> lck(mut_b);b) { do something...
}
}
如所見,lock_guard(mutex) 是嵌套使用的,Q2它是否正確且執行緒安全?
uj5u.com熱心網友回復:
我認為這里的一個問題是
if (bool x = true)
{
// x is in scope
}
else
{
// x is STILL in scope!
x = false;
}
因此,第一個鎖定mut_a仍然保留在else塊中。這可能是您的意圖,但如果是這樣的話,我認為這不是撰寫它以提高可讀性的最佳方式。
此外,如果!a在關鍵部分很重要,b您需要保持鎖定a。
uj5u.com熱心網友回復:
代碼本身并不是不安全的。然而, ...
正如另一個答案中已經提到的,您需要考慮互斥鎖也在 else 分支中被鎖定:
if (lock_guard<mutex> lck(mut_a);a) { do something...
// mut_a is locked
} else {
if (lock_guard<mutex> lck(mut_b);b) { do something...
// mut_a and mut_b are locked
}
}
也許這是故意的。如果不是,那么它是錯誤的。
此外,您需要小心同時鎖定多個互斥鎖。當您在其他地方以不同的順序鎖定它們時,將會出現死鎖:
{
lock_guard<mutex> lock_b(mut_b);
lock_guard<mutex> lock_a(mut_a);
// do something
}
您的代碼鎖定mut_a并僅在它能夠獲得對mut_b. 此代碼鎖定mut_b并僅在它能夠獲得鎖定后釋放它mut_a。
為了避免這種死鎖,您可以使用std::scoped_lock需要多個互斥鎖并使用一些死鎖避免演算法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/495878.html
