我有以下類:C++ 11 const - 我的代碼是否線程安全?
class Object
{
public:
Object() {}
const std::string& get_name() const
{
if(_name.empty()) {
std::lock_guard<std::mutex> lock(_lock);
// Check if its still empty. Some other thread might have gotten here first
if(_name.empty()) {
//Run expensive operation
_name = get_object_name();
}
}
return _name;
}
private:
std::string get_object_name(); // <- Expensive function
mutable std::mutex _lock;
mutable std::string _name;
};
由於對get_object_name
是一個昂貴的功能的事實,我願做一個排序延遲初始化的並且只調用它的第一次get_name()
被調用。如果它從未被調用,那麼我不會浪費資源來獲取名稱。
我很擔心第一次致電_name.empty()
。我的當前代碼是否保證是線程安全的,還是需要將鎖移動到函數的頂部?
我看了一些香草薩特的會談,特別是this one,在這張幻燈片上出現:
http://i.imgur.com/Jz4luYe.png
導致我相信,到empty()
調用是線程安全的。但我的變量(_name
)是mutable
。這個「const ==線程安全」規則是否仍然適用於此?
get_name()
是唯一可以修改_name
的功能。
有該模式的名稱:雙檢鎖(https://en.wikipedia.org/維基/雙checked_locking)。它適用於某些環境,而不適用於其他環境。當它不起作用時,原因很微妙。 –