C++ 线程安全局部变量 void HelloWorld() { 静态标准::原子静态计数器=0; short val=++static_counter;//或val=static_counter++; }

C++ 线程安全局部变量 void HelloWorld() { 静态标准::原子静态计数器=0; short val=++static_counter;//或val=static_counter++; },c++,thread-safety,c++14,C++,Thread Safety,C++14,如果从两个线程调用此函数 局部变量val能否在两个线程中都1?或者(如果使用了静态计数器+++,则为0?否。val在两个线程中具有相同值的唯一方法是两个原子操作重叠。根据定义,原子操作不能重叠 两个线程中的局部变量val是否都可以为1 否。++静态计数器相当于: void HelloWorld() { static std::atomic<short> static_counter = 0; short val = ++static_counter; // or val

如果从两个线程调用此函数


局部变量
val
能否在两个线程中都
1
?或者(如果使用了静态计数器+++,则为0?

否。
val
在两个线程中具有相同值的唯一方法是两个原子操作重叠。根据定义,原子操作不能重叠

两个线程中的局部变量val是否都可以为1

否。
++静态计数器
相当于:

void HelloWorld()
{
   static std::atomic<short> static_counter = 0;
   short val = ++static_counter; // or val = static_counter++;
}

它不能为两个(或更多)线程返回相同的值,因为它以原子方式执行。

可能重复@user2807083这不是问题所在。我知道静态计数器将被安全初始化。c++11标准要求这样做。我说的是val,它不是静态的。我想这里并不是关于本地的
var
,而是关于应用于静态变量的++运算符。所以我认为正确的问题是“原子变量的增量是线程安全的吗?”你的问题是关于静态变量的线程安全,而不是局部变量。这同样适用于静态计数器++?是的。这相当于
fetch\u add(1)
。请阅读以了解更多详细信息。涉及两件事,
static\u counter
对象的构造和增量操作。后者保证是原子的,但根据评论中的链接,构造不是原子的。@UlrichEckhardt:C++11规范通过核心语言保证构造。@Phantom说一个操作可以实现为两个可除的操作,这与说该操作不是原子的是一样的。但是我们知道这个操作是原子的。
 fetch_add(1)+1