多个读取器可以通过获取/释放顺序与同一写入器同步吗?

Des*_*ise 2 c++ atomic memory-model memory-barriers stdatomic

读完“行动中的并发”后,我找不到一个问题的答案 - 当我们在一个原子变量上有一个存储(释放)和许多加载(获取)时,读取副作用的标准是否有保证?假设我们有:

int i{};
atomic<bool> b{};

void writer(){
 i=42;
 b.store(true,memory_order_release);
}

void reader(){
 while(!b.load(memory_order_acquire))
    this_thread::yield();
 assert(i==42);
}
//---------------------
thread t1{writer},t2{reader},t3{reader};
Run Code Online (Sandbox Code Playgroud)

如果我们只有一个读取器,一切都可以,但是我们是否可以在 t2 或 t3 线程中断言失败?

LWi*_*sey 6

这是一个教科书示例,说明了存储到i输入writer和加载自之间的发生之前关系i两个线程中的reader之间的先行关系。

涉及多个读者并不重要。商店到b与观察更新值的所有读取器同步(这最终将由于循环而发生)。

我认为您正在寻找的报价是:

对原子对象 M 执行释放操作的原子操作 A 与对 M 执行获取操作的原子操作 B 同步,并从以 A 为首的释放序列中的任何副作用中获取其值。

并没有说这仅限于单次加载操作

  • 我只是猜测询问者可能会认为发布存储只有足够的同步“魔力”来与一个阅读器同步,并且该阅读器将耗尽其与其他任何东西同步的能力。如果是这样,可能有助于理解这不是它的工作原理。在实际实现中,写入器中的释放操作命令对一致共享高速缓存/内存的访问。之前在该线程中加载/存储。Acquire 对于读端来说是类似的,只是命令该 CPU 核心访问一致的共享状态。https://preshing.com/20120913/acquire-and-release-semantics/ (2认同)