为什么memory_order_seq_cst没有保护我的原子操作运行序列?


#include <assert.h>
#include <atomic>
#include <iostream>
#include <thread>
std::atomic_bool b(false);
std::atomic_bool lock{false};
void producer() {
b.store(true, std::memory_order_seq_cst);
lock.store(true, std::memory_order_seq_cst);
}
void consume() {
while (!lock.load(std::memory_order_seq_cst))
;
assert(b.load(std::memory_order_seq_cst));
b.store(false, std::memory_order_seq_cst);
lock.store(false, std::memory_order_seq_cst);
}
int main() {
std::thread t1([&]() {
while (true)
consume();
});
std::thread t2([&]() {
while (true)
producer();
});
t1.join();
t2.join();
}

consume中的断言永远不会失败,memory_order_seq_cst保证atmoic操作按写入顺序运行;

但是断言失败发生了:(

对于一对produce()consume(),您的分析是正确的,但对于它们的无休止循环,则不是正确的。

线程1 线程2
b.store(true, std::memory_order_seq_cst);
lock.store(true, std::memory_order_seq_cst);
while (!lock.load(std::memory_order_seq_cst));
assert(b.load(std::memory_order_seq_cst));
b.store(true, std::memory_order_seq_cst);
b.store(false, std::memory_order_seq_cst);
lock.store(false, std::memory_order_seq_cst);
lock.store(true, std::memory_order_seq_cst);
while (!lock.load(std::memory_order_seq_cst));
assert(b.load(std::memory_order_seq_cst));断言触发
void producer() {
b.store(true, std::memory_order_seq_cst);      // 1
lock.store(true, std::memory_order_seq_cst);   // 2
}
void consume() {
while (!lock.load(std::memory_order_seq_cst))
;                                            // 3
assert(b.load(std::memory_order_seq_cst));     // 4
b.store(false, std::memory_order_seq_cst);      // 5
lock.store(false, std::memory_order_seq_cst);   // 6
}

以下步骤将使断言失败:1->5->6->2->3->4

最新更新