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

标签 c++ race-condition undefined-behavior

假设我定义了以下 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/

相关文章:

php - 如何测试由对 php 的多个 ajax 请求创建的竞争条件?

c - 如何无害地杀死子进程

c++ - 在 MyClass 指针的容器中找到一个 void 指针?

C++ 重载模式 : call resolution with mutable lambda

c++ - 全局指针是否初始化为零?

MySQL加载数据错误

C语言字母数字检查错误字符

c++ - 为什么我的代码无法处理大数组输入(>10000)?

c++ - 如何从一维数组中提取子图像?

c++ - Opencv_traincascade 卡住