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