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
欢迎任何评论 - 谢谢