多个读者可以通过 acquire/release 顺序与相同的作者同步吗?
Can multiple readers synchronize with the same writers with acquire/release ordering?
阅读“并发实践”后,我找不到一个问题的答案 - 当我们在一个原子变量上有一个存储(发布)和多个加载(获取)时,标准是否保证读取副作用?
假设我们有:
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};
如果我们只有一个 reader,没问题,但是我们可以在 t2 或 t3 线程中断言失败吗?
这是 writer
中到 i
的存储与两个 reader
线程中来自 i
的负载之间的先行关系的教科书示例.
涉及多个读者并不重要。 b
的存储与所有观察到更新值的读者同步(由于循环,这最终会发生)。
我想你要找的报价是:
An atomic operation A that performs a release operation on an atomic object M synchronizes with an atomic
operation B that performs an acquire operation on M and takes its value from any side effect in the release
sequence headed by A.
并没有说这个仅限于单次加载操作
阅读“并发实践”后,我找不到一个问题的答案 - 当我们在一个原子变量上有一个存储(发布)和多个加载(获取)时,标准是否保证读取副作用? 假设我们有:
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};
如果我们只有一个 reader,没问题,但是我们可以在 t2 或 t3 线程中断言失败吗?
这是 writer
中到 i
的存储与两个 reader
线程中来自 i
的负载之间的先行关系的教科书示例.
涉及多个读者并不重要。 b
的存储与所有观察到更新值的读者同步(由于循环,这最终会发生)。
我想你要找的报价是:
An atomic operation A that performs a release operation on an atomic object M synchronizes with an atomic operation B that performs an acquire operation on M and takes its value from any side effect in the release sequence headed by A.
并没有说这个仅限于单次加载操作