は、私は以下のクラスがありますため、高価な機能であるget_object_name
の事実に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_name()
が初めて呼び出されたときにそれを呼び出すしたいと思います。もしそれが決して呼び出されなければ、私は名前をつかむ無駄な資源を使いません。
私は_name.empty()
への最初の呼び出しを心配しています。現在のコードはスレッドセーフであることが保証されているのですか、ロックを関数の先頭に移動する必要がありますか? empty()
への呼び出しは、スレッドセーフであると信じて私をリード
http://i.imgur.com/Jz4luYe.png
:
私はこのスライドが立ち上がっthis one特にハーブサッターの会談、のいくつかを見ました。しかし、私の変数(_name
)はmutable
です。その "const ==スレッドセーフ"ルールはここでも適用されますか?
get_name()
は、_name
を変更できる唯一の機能です。
そのパターンの名前があります:[ダブルチェックロック](https://en.wikipedia.org/は、 wiki/Double-checked_locking)を実行します。いくつかの環境で動作し、他の環境では動作しません。それがうまくいかない場合、理由は微妙です。 –