魔法静态保证右侧只执行一次吗?

时间:2014-11-05 14:23:07

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

如果我有

atomic<int> cnt=0;

int get_int() noexcept
{
   cnt++;
   return rand();
}

然后:

void func()
{
   static const auto value = get_int();
}

我知道value的初始化没有竞争条件,但我不知道是否 get_int()将被调用一次,或者在我的示例中cnt将为1(而不是2,3,4或5)。

假设多个帖子输入func(),而get_intfunc()中只有一个号码。

2 个答案:

答案 0 :(得分:8)

C ++ 11保证不存在竞争条件 N3797 - §6.7/ 4

  

允许实现使用static或者执行其他块范围变量的早期初始化       在允许实现静态初始化的相同条件下的线程存储持续时间       在命名空间范围内具有静态或线程存储持续时间的变量(3.6.2)。否则这样的变量是       初始化第一次控制通过其声明;这样的变量被认为是初始化的       完成初始化。如果初始化通过抛出异常退出,则初始化       未完成,因此下次控制进入声明时将再次尝试。如果控制进入       在初始化变量的同时声明,并发执行应该等待       完成初始化.92如果控件在变量存在时递归地重新输入声明       初始化后,行为未定义。 [示例:

int foo(int i) {
  static int s = foo(2*i); // recursive call - undefined
  return i+1;
}
     

- 结束示例]

它不是可重入但是线程安全的。请确保代码的其他部分无论如何都不会在get_int()之前调用func()

答案 1 :(得分:1)

get_int()只会从该行调用一次,但考虑到您的代码,可以事先从代码中的不同位置调用get_int()