gpt4 book ai didi

c++ - atomic thread fence : Why is there a data race on this non atomic variable? 这有关系吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:48 24 4
gpt4 key购买 nike

假设我们有 2 个线程。一个生产者和一个消费者。我们有生产数据的生产者,以及使用这些数据的消费者。然而守卫不是原子的!

bool isDataReady = false;
int data = 0;

void Producer() {
data = 42;
std::atomic_thread_fence(std::memory_order_release);
isDataReady = true;
}

void Consumer() {
while(!isDataReady);
std::atomic_thread_fence(std::memory_order_acquire);
assert(data == 42);
}

我想知道为什么 isDataReady 上存在数据竞争。通常,正确的代码应该是对原子 bool 变量使用 relaxed 排序。

是不是因为对isDataReady的写(事务)在读之前还没有完成?即使是这样,这真的是个问题吗?

最佳答案

长话短说

这种数据竞争很危险,您应该注意消除它。它可能不会因为你的运气而表现出来,但它最终会让人头疼。

有点长

此代码由于以下几个问题而存在问题:

  1. 编译时 Consumer编译器不知道 isDataReady可以改变背景,所以发出 while(!isDataReady) 是完全合理的一个无限循环或什么都没有(由于 forward progress guarantee ,正如评论中指出的那样)。

  2. 如果写入和/或读取 bool不是原子的(在大多数平台上不是这种情况,但理论上是可能的)任何读取都可能导致获取垃圾数据。

  3. 内存栅栏 std::memory_order_release确保线程中发生的更改在其他线程使用 std::memory_order_acquire 调用 fence 后可见。 (至少在简化方面)。因此,bool 变量的变化在其他线程中可能是不可见的。

  4. 由于现代处理器的超标量架构,操作可能会在运行时由处理器重新排序。所以内存顺序写入 ProducerConsumer 可见可能与代码中的不同。

关于c++ - atomic thread fence : Why is there a data race on this non atomic variable? 这有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54110588/

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