(假设 VC++ 2010:(1)可以使用 /volatile:ms,(2)还没有 std::atomic,(3)没有线程安全的静态变量初始化,(4)没有 std::call_once)
如果我有一个普通的 C 指针,我可以实现以下双重检查锁定模式,以避免每次锁定的成本:
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 或 boost::shared_ptr 替换普通指针,我将如何做同样的事情?如何使 shared_ptr 不稳定?我需要另一个 volatile 标志吗?