gpt4 book ai didi

c++ - memory_order_seq_cst 如何与非原子操作同步?

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

如果使用单个原子变量和 std::memory_order_seq_cst,是否保证非原子操作不会被重新排序?

例如,如果我有

std::atomic<bool> quux = {false};

void foo() {
bar();
quux.store(true, std::memory_order_seq_cst);
moo();
}

bar() 保证在调用 store 之后不会重新排序,并且 moo() 在调用之前不会重新排序store,只要我使用std::memory_order_seq_cst,至少从另一个线程的角度来看?

或者,换句话说,如果从另一个线程运行,以下假设是否有效?

if(quux.load(std::memory_order_seq_cst) == true) {
// bar guaranteed to be called; its side-effects are visible
// moo might have been called, but is not guaranteed to
} else {
// bar might have been called, but is not guaranteed to
// moo might have been called, but is not guaranteed to
}

请注意,我假设 barmoo 都没有使用原子操作、互斥锁、锁、栅栏或其他同步功能。

最佳答案

根据链接http://en.cppreference.com/w/cpp/atomic/memory_order由 @Maxim 链接,关于 memory_order_seq_cst 存在错误。上面的文本与 memory_order_acq_rel 交换。 memory_order_seq_cst 的文本:

memory_order_seq_cst:这个内存顺序的load操作执行acquire操作,store执行release操作,read-modify-write同时执行acquire操作和release操作,再加上所有线程存在一个总顺序以相同的顺序观察所有修改(请参阅下面的顺序一致排序)

因此在您的情况下,存储操作等同于释放,这意味着 moo() 可以在栅栏之前重新排序。

关于c++ - memory_order_seq_cst 如何与非原子操作同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41342206/

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