use std::sync::atomic::{AtomicUsize, Ordering};
fn increment_counter(counter: &AtomicUsize) -> usize {
loop {
let current = counter.load(Ordering::Relaxed);
if current >= 10 {
return current;
}
let new = current + 1;
match counter.compare_and_swap(current, new, Ordering::Relaxed) {
// compare_and_swap的第一个参数是期望的当前值
// 第二个参数是想要设置的新值
// 第三个参数是内存顺序,这里Relaxed表示对内存顺序要求最低,
// 仅保证原子操作本身的原子性,不保证内存可见性等其他顺序相关的约束
prev if prev == current => return new,
_ => continue,
}
}
}
实现思路
- 循环尝试:使用
loop
无限循环,因为CAS操作可能会失败,需要不断尝试。
- 加载当前值:通过
counter.load(Ordering::Relaxed)
获取当前计数器的值。
- 检查条件:如果当前值大于等于10,直接返回当前值。
- 计算新值:如果当前值小于10,计算新值
new
为当前值加1。
- 执行CAS操作:使用
compare_and_swap
方法尝试将计数器的值从current
更新为new
。如果更新成功(即返回值prev
等于current
),则返回新值new
;如果失败(即返回值prev
不等于current
),则继续循环尝试。