这个线程安全吗:
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 的写入并在早期变得可见。我认为上面的代码没有这个问题,因为新值的有效性没有前提条件。我认为这是正确代码的唯一要求是,对于构造函数中的写入和锁定下的写入而言,锁定下的所有读取都必须是干净的。
更新:好的,这似乎引发了“未定义行为”的陷阱,因此可以合法地做任何事情,包括耗尽你的银行账户。也就是说,是否存在行为不端的情况?