void undefined_behaviour_with_double_checked_locking()
{
if(!resource_ptr) #1
{
std::lock_guard<std::mutex> lk(resource_mutex); #2
if(!resource_ptr) #3
{
resource_ptr.reset(new some_resource); #4
}
}
resource_ptr->do_something(); #5
}
如果一個線程看到另一個線程寫入的指針,它可能不是 看到some_resource的新創建的實例,從而導致調用 到do_something()操作上不正確的值。這是一個 的示例,該競爭條件的類型被C++標準定義爲數據爭用 ,因此被指定爲未定義的行爲。解釋競態條件雙重檢查鎖定
問題>我已經看到了爲什麼代碼具有雙重檢查鎖定的問題導致了比賽狀態,在上述說明。但是,我仍然很難理解問題所在。也許一個具體的雙線程分步工作流程可以幫助我真正理解上述代碼的競爭問題。
一個接書中提到的解決方案如下:
std::shared_ptr<some_resource> resource_ptr;
std::once_flag resource_flag;
void init_resource()
{
resource_ptr.reset(new some_resource);
}
void foo()
{
std::call_once(resource_flag,init_resource); #1
resource_ptr->do_something();
}
#1 This initialization is called exactly once
任何意見,歡迎 - 謝謝
閱讀[這個答案]的第二部分(http://stackoverflow.com/a/367690/14065)的一些非顯而易見的問題。 – 2011-12-20 07:03:39