我知道我可以在一個類中使用一個mutex
成員,並將其鎖定在每個方法中以防止多線程環境中的數據競爭。但是,如果在類的方法中存在嵌套調用,如下面的類中的add_one()
和add_two()
,則此方法可能會導致死鎖。對每種方法使用不同的mutex
是一種解決方法。但是,在嵌套調用的情況下,是否有更原則更優雅的方法來防止死鎖?設計線程安全類時避免嵌套調用造成死鎖
class AddClass {
public:
AddClass& operator=(AddClass const&) = delete; // disable copy-assignment constructor
AddClass(int val) : base(val) {}
int add_one() { return ++base; }
int add_two() {
add_one;
add_one;
return base;
}
private:
int base;
};
鎖定和實現的關注分離是正確的方法。遞歸互斥應該是最後的手段。 +1 –