在 C++ 中,std::atomic<bool>
提供了线程安全的原子操作。以下是问题的详细解答:
1. a = true;
和 a.store(true);
的区别
- 语义相同:两者最终都会将
a
的值原子地设置为true
。 - 细微差异:
a = true;
是运算符重载,语法更简洁,但隐藏了底层原子操作的细节。默认使用memory_order_seq_cst
(最严格的内存序,保证全局顺序一致性)。
a = true; // 等价于 a.store(true, std::memory_order_seq_cst);
a.store(true);
显式调用成员函数,可以指定内存序(默认为memory_order_seq_cst
),适合需要优化性能的场景。
a.store(true, std::memory_order_release); // 可指定更宽松的内存序
2. if (a)
和 if (a.load())
的区别
- 语义相同:两者都会原子地读取
a
的当前值并判断是否为true
。 - 细微差异:
if (a)
是运算符重载(隐式调用load()
),语法简洁,默认使用memory_order_seq_cst
。
if (a) {} // 等价于 if (a.load(std::memory_order_seq_cst)) {}
if (a.load())
显式调用成员函数,可以指定内存序(默认为seq_cst
),适合需要精细控制内存顺序的场景。
if (a.load(std::memory_order_acquire)) {} // 可指定更宽松的内存序
关键点总结
操作 | 等效形式 | 内存序(默认) | 适用场景 |
---|---|---|---|
a = true; |
a.store(true, seq_cst); |
memory_order_seq_cst |
代码简洁,强一致性需求 |
a.store(true) |
- | memory_order_seq_cst |
需灵活指定内存序时 |
if (a) |
if (a.load(seq_cst)) |
memory_order_seq_cst |
代码简洁 |
if (a.load()) |
- | `memory_order_seq_cst 内容由零声教学AI助手提供,问题来源于学员提问 |