我想了解编译器对 C 中的非易失性变量有什么限制。
我不确定它是否真实,但有人告诉我,如果你有以下代码:
int x;
...
void update_x() {
lock();
x = x*5+3;
unlock();
}
您必须获取锁才能读取 x,因为即使很难编译器也不太可能这样做,从技术上讲,它将诸如 x*5 之类的中间计算存储到 x 中是合法的,因此读取可能会读取中间值。所以我的第一个问题是是否确实如此?如果不是,为什么不呢?
如果是,我有一个后续问题,是否有任何东西阻止编译器在获取锁之前或之后使用 x 作为临时存储?(假设编译器可以证明执行程序的单个线程不会注意到它)。
如果不是,这是否意味着任何具有非易失性共享变量的程序在技术上都是未定义的,即使所有访问都受到锁的保护?
谢谢,伊利亚