(假設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。 –