cae 0.0.1

A demo for 'Scoped Thread' Compare and Exchange
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));
}