<分区>
自从我开始使用多线程以来,我一直在问自己这个问题:
从不同的线程写入和读取变量是未定义的行为吗?
让我们使用最小的示例,我们在一个线程中递增一个整数并在另一个线程中读取该整数。
void thread1()
{
x++;
}
void thread2()
{
if (x == 5)
{
//doSomething
}
}
我知道加法操作不是原子的,因此我可以在第一个线程进行加法操作时从第二个线程读取数据,但有些事情我不太确定。
x
是否保持他的值直到整个加法操作完成然后被分配这个新值,或者 x
是否有一个中间状态,从它读取会导致未定义的行为。
如果第一个理论适用,那么在写入时从 x
读取将简单地返回加法之前的值,并且不会有太大问题。
如果第二个理论是正确的,有人可以更详细地解释加法运算的过程是什么以及为什么它会是未定义的行为(也许有一个例子?)
谢谢