我讀併發編程C++鎖定模式和整個這一段代碼來了。這本書提到了討厭的競賽條件的可能性。雙重檢查的C++並行編程
void undefined_behaviour_with_double_checked_locking(){
if(!resource_ptr){ //<1>
std::lock_guard<std::mutex> lk(resource_mutex);
if(!resource_ptr){ //<2>
resource_ptr.reset(new some_resource); //<3>
}
}
resource_ptr->do_something(); //<4>
}
這裏是該書的解釋引用。然而,我只是不能拿出一個真實的例子。我想知道這裏有人能幫助我。
不幸的是,這種模式是臭名昭著的一個原因:它具有討厭的競爭條件 潛力,因爲讀鎖外 < 1>未與被另一個線程內 的完成寫同步鎖< 3>。因此,這將創建一個覆蓋不 只是指針本身也是指向的對象中的競爭條件;即使 線程看到由另一個線程寫入的指針,它也可能不會看到新創建的some_resource實例的 ,從而導致對不正確的值進行操作的 4>操作。
這句話似乎很好地解釋了它......什麼算作「真實的例子」?您是否在尋找關於代碼如何失敗的更詳細的解釋? – dlf 2014-09-12 19:51:02
這裏有什麼讓我感到困惑的是,在兩個線程都調用這個函數的情況下,情況似乎沒有問題,我們也沒有看到問題......所以我想知道真正的問題是什麼.. @ dlf – Decipher 2014-09-12 19:54:26