このスレッドは安全ですか:
class X;
class Once {
public:
Once(X* x) : x_(x) {}
X* Get() {
if (!x_) return NULL;
// all dirty reads end up here.
// This could be any type of scoped lock...
some_scoped_lock lock(m);
// if (!x_) return x_; // omitted because it's a no op
X* ret(x_); // might get NULL if we waited for lock
x_ = NULL; // idempotent
return ret;
}
private:
X *x_;
some_kind_of_mutex m;
// Boilerplate to make all other constructors and default function private
....
}
(編集: c++11 と古いバージョンの両方に興味があります)
私が理解しているように、ダブルチェック ロックの問題は、一部のメモリ モデルでは、保護された var への書き込みが発生し、早期に表示される可能性があることです。新しい値の有効性の前提条件がないため、上記のコードにはこの問題はないと思います。これが正しいコードであるための唯一の要件は、ロック下のすべての読み取りが、コンストラクターでの書き込みとロック下の書き込みに関してクリーンでなければならないことだと思います。
更新: OK、これは「未定義の動作」の落とし穴を引き起こし、そのため、銀行口座を空にするなど、合法的に何でもできるようです。とはいえ、誤動作する場合はありますか?