std::atomic<>
的 exchange()
方法是 C++ 原子操作中的一个关键函数,用于原子地交换原子对象的值并返回其旧值。以下是详细说明:
功能
原子交换
将原子对象的当前值替换为指定的新值,并返回替换前的旧值,整个过程是原子的(不会被线程调度打断)。- 语法:
T exchange(T desired, std::memory_order order = std::memory_order_seq_cst);
- 参数:
desired
:要设置的新值。
order
(可选):内存顺序模型(默认为最严格的顺序一致性seq_cst
)。
- 语法:
线程安全保证
在多线程环境中,其他线程无法观察到中间状态,确保操作的完整性和一致性。
使用示例
#include <atomic>
#include <iostream>
int main() {
std::atomic<int> counter(10);
// 原子地将 counter 从 10 替换为 20,并返回旧值 10
int old_value = counter.exchange(20);
std::cout << "Old value: " << old_value << "\n"; // 输出: Old value: 10
std::cout << "New value: " << counter.load() << "\n"; // 输出: New value: 20
return 0;
}
典型应用场景
- 实现自旋锁
”`cpp std::atomiclock(false);
void acquire_lock() {
while (lock.exchange(true)) {} // 忙等待直到获取锁
}
void release_lock() {
lock.store(false);
} “`
无锁数据结构
在无锁队列或栈中,用于安全地更新指针或状态标志。状态切换
例如线程池中标记任务状态(空闲/运行)。
内存顺序选项
std::memory_order_relaxed
:仅保证原子性,无顺序约束。
std::memory_order_acquire/release
:实现同步机制(如锁)。
std::memory_order_seq_cst
(默认):严格顺序一致性,性能开销最大但最安全。
与 compare_exchange_strong/weak的区别
exchange()
:直接无条件替换值。
compare_exchange_*
:仅在当前值与预期值匹配时才替换(更复杂但灵活)。
如果需要简单的“读-改-写”操作且不依赖条件判断,优先使用 exchange()
。
内容由零声教学AI助手提供,问题来源于学员提问