gpt4 book ai didi

c++ - 'undefined'怎么可能是竞争条件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:47 25 4
gpt4 key购买 nike

假设我定义了以下 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() 以获取一个数字(如果之前未调用 changeFoo(),则该数字将始终为 0)。在某个时候,T2 调用 changeFoo() 来更改它(没有任何线程同步)。

现代 计算机体系结构和编译器中,T1 获得的值是否有任何实际机会不同于 0 或 5?到目前为止我调查的所有汇编代码都是使用 32 位内存读写,这似乎保存了操作的完整性。

其他原始类型呢?

实用 意味着您可以给出一个现有架构或符合标准的编译器的示例,其中(或具有不同代码的类似情况)在理论上是可能的.我让现代这个词有点主观。


编辑:我看到很多人注意到我不应该期望 5 永远被阅读。这对我来说非常好,我没有说我这样做(尽管感谢您指出这方面)。我的问题更多是关于上述代码会发生什么样的数据完整性违规。

最佳答案

在实践中,据我所知,除了 05 之外,您不会看到任何其他内容(可能是一些奇怪的 16 位架构和 32 位 int 不是这种情况)。

但是,我们无法保证您是否真的看到 5

假设我是编译器。

我明白了:

while (aObject.getFoo() == 0) {
printf("Sleeping");
sleep(1);
}

我知道:

  • printf 不能改变aObject
  • sleep 不能改变aObject
  • getFoo 不会改变 aObject(感谢内联定义)

因此我可以安全地转换代码:

while (true) {
printf("Sleeping");
sleep(1);
}

因为在此循环期间没有其他人访问 aObject根据 C++ 标准

这就是未定义行为的意思:超预期。

关于c++ - 'undefined'怎么可能是竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15020171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com