cae-0.0.1 is not a library.
use std::sync::atomic::{AtomicI32, Ordering};
fn main() {
// 创建原子计数器,初始值为0
let counter = AtomicI32::new(0);
// 使用作用域线程确保所有线程在作用域结束前完成
std::thread::scope(|s| {
// 创建10个线程
for _ in 0..10 {
// 每个线程获得对计数器的不可变引用
// 由于作用域线程保证所有线程在作用域结束前完成,
// 因此可以安全地共享对局部变量的引用
s.spawn(|| {
// 循环直到成功更新计数器
loop {
// 读取当前值(使用 Acquire 内存顺序确保后续操作不会重排到前面)
let current = counter.load(Ordering::Acquire);
// 计算新值(当前值加1)
let new = current + 1;
// 核心:Compare and Exchange (CAS) 操作
// 尝试原子性地将计数器从 current 更新为 new
// 参数说明:
// current - 期望的当前值(我们认为计数器应该具有的值)
// new - 如果期望值匹配,要设置的新值
// Ordering::SeqCst - 成功时的内存顺序(最严格的顺序一致性)
// Ordering::Relaxed - 失败时的内存顺序(最低开销)
let result = counter.compare_exchange(
current,
new,
Ordering::SeqCst,
Ordering::Relaxed
);
// 处理 CAS 操作结果
match result {
// 成功:值匹配并被更新
Ok(_) => break, // 退出循环,任务完成
// 失败:当前值已改变(被其他线程更新)
Err(_) => {
// 值不匹配,说明其他线程已经修改了计数器
// 继续循环重试(标准 CAS 重试模式)
}
}
}
});
}
}); // 作用域结束,等待所有线程完成
// 打印最终结果(使用 Relaxed 顺序,因为此时没有竞争)
println!("Final counter value: {}", counter.load(Ordering::Relaxed));
}