(假设VC++ 2010:(1)可以使用/易失性:毫秒,(2)无标准::原子又,(3)没有线程安全静态变量初始化,( 4)无标准:: call_once的)如何使用双重检查锁初始化一个shared_ptr
如果我有一个普通的C指针,我可以IMPL以下双重检查锁定模式,以避免锁定的成本每次:
static volatile void * ptr = nullptr;
//...
if (ptr == nullptr)
{
// Acquire Lock
if (ptr == nullptr)
{
// some code
// ptr = ...; // init ptr
}
// Release Lock
}
// ....
由于VC++ 2005,该volatile会确保上面的代码是正确的。假设我确定代码不可移植。
现在假设我需要一个std :: shared_ptr的替换普通的指针或升压:: shared_ptr的,我怎么会做同样的事情?如何使该shared_ptr易变?我需要另一个挥发性旗帜吗?
没有,没有。双重检查锁定是不好的。 – Puppy
是什么让你相信'volatile'使得代码正确? –
如果您将'static volatile void * ptr = nullptr;'更改为'std :: atomic ptr = nullptr;'双重检查的锁定将起作用。这假定C++ 11。 –