假设我定义了以下 C++ 对象:
class AClass
{
public:
AClass() : foo(0) {}
uint32_t getFoo() { return foo; }
void changeFoo() { foo = 5; }
private:
uint32_t foo;
} aObject;
该对象由两个线程 T1 和 T2 共享。T1 不断地在一个循环中调用以获得一个数字(如果之前没有调用getFoo()
,它将始终为 0 )。changeFoo()
在某些时候,T2 调用changeFoo()
来更改它(没有任何线程同步)。
对于现代计算机体系结构和编译器,T1 获得的值是否有可能不同于0 或 5?到目前为止,我调查的所有汇编代码都是使用 32 位内存读写,这似乎保存了操作的完整性。
其他原始类型呢?
实用意味着您可以给出一个现有架构或符合标准的编译器的示例,其中(或具有不同代码的类似情况)在理论上是可能的。我让现代这个词有点主观。
编辑:我可以看到很多人注意到我不应该期望 5 被阅读。这对我来说很好,我没有说我这样做(尽管感谢您指出这方面)。我的问题更多的是关于上述代码可能会发生什么样的数据完整性违规。