C++ 正在从不同线程写入和读取变量未定义行为

Jus*_*ude 5 c++ multithreading

自从我开始使用多线程以来,我一直在问自己这个问题:

是否从不同线程写入和读取变量未定义行为?

让我们使用最小的例子,我们在一个线程中增加一个整数并读取另一个线程中的整数。

void thread1()
{
    x++;
}

void thread2()
{
    if (x == 5)
    {
        //doSomething
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道加法操作不是原子的,因此我可以在第一个线程处于加法操作中间时从第二个线程读取,但有些事情我不太确定。

不会x让他的价值,直到整个加法操作完成,然后被分配这个新的价值,还是x有一个中间状态,其中从中读取会导致不确定的行为。

如果第一个理论适用,那么x在写入时读取将简单地在添加之前返回值并且不会有那么大的问题。

如果第二个理论是正确的,有人可以更详细地解释加法运算的过程是什么以及为什么它会是未定义的行为(也许举个例子?)

谢谢

Aik*_*Aik -3

x(32 位变量)将始终在 32 位以上 cpu 上定义,但不那么精确。您知道 x 可以是 ++ 定义的从开始到结束范围内的任何值。

就像下面的情况一样:x 被初始化为 0,并且您调用 thread1 5 次,线程 2 可以看到该 x 在 0 到 5 的范围内。

这意味着我可以将整数分配给内存视为原子的。

有一些原因导致两个线程上的 x 不同步,例如,线程 1 上的 x 为 5,而线程 2 上的 x 可以同时为 0。原因之一是每个核心的 cpu 缓存都不同。要同步缓存之间的值,您必须使用内存屏障。您可以使用例如std::atomic,它对您来说非常有用