如果我有
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_int
在func()
中只有一个号码。
答案 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()
。