C ++ 11函数局部静态const对象的线程安全初始化

时间:2016-11-13 21:50:35

标签: c++ multithreading c++11 static initialization

此问题已在C ++ 98上下文中提出,并在该上下文中得到了回答,但没有明确说明C ++ 11

const some_type& create_const_thingy()
{
    lock my_lock(some_mutex);
    static const some_type the_const_thingy;
    return the_const_thingy;
}

void use_const_thingy()
{
    static const some_type& the_const_thingy = create_const_thingy();

    // use the_const_thingy
}

这种初始化模式是否可以确保:

  1. 没有出现竞争条件
  2. create_const_thingy仅被调用一次
  3. 如果我们删除互斥锁,这仍然有效吗?
  4. 提前致谢!

1 个答案:

答案 0 :(得分:8)

从C ++ 11开始,所有静态局部变量都保证只能以线程安全的方式初始化一次。

根据cppreference

  

如果多个线程尝试初始化相同的静态本地   并发变量,初始化恰好发生一次(类似   可以使用std::call_once)获取任意函数的行为。   注意:此功能的常规实现使用的变体   双重检查锁定模式,减少运行时开销   已经初始化的局部静态到单个非原子布尔值   比较。

所以,对于你的问题: