(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を揮発性にする方法は? 別の揮発性フラグが必要ですか?