1 锁的基础

1.1 定义与分类

01.锁的定义
    a.概念
        锁是一种同步原语,用于保护共享数据,防止多个线程同时访问造成数据竞争。
    b.Rust中的锁
        Mutex:互斥锁,同一时刻只允许一个线程访问。
        RwLock:读写锁,允许多个读者或一个写者。
        Atomic:原子类型,提供无锁的原子操作。

02.锁的分类
    a.按功能分类
        互斥锁:保证互斥访问。
        读写锁:区分读写操作,提高并发性。
        自旋锁:忙等待,适合短时间持有。
    b.按实现分类
        操作系统锁:依赖系统调用。
        用户态锁:在用户空间实现。
        原子操作:硬件级别的原子性保证。

03.Rust锁的特点
    a.类型安全
        通过类型系统保证锁的正确使用。
    b.RAII机制
        锁的获取和释放通过Guard自动管理。
    c.所有权系统
        编译时防止数据竞争。

1.2 互斥锁:Mutex

01.Mutex基本概念
    a.定义
        Mutex提供互斥访问,同一时刻只允许一个线程持有锁。
    b.代码示例
        ---
        use std::sync::Mutex;

        fn main() {
            let m = Mutex::new(5);
            {
                let mut num = m.lock().unwrap();
                *num = 6;
            }
            println!("{:?}", m);
        }
        ---

02.跨线程使用
    a.Arc<Mutex<T>>
        使用Arc包装Mutex实现跨线程共享。
    b.代码示例
        ---
        use std::sync::{Arc, Mutex};
        use std::thread;

        fn main() {
            let counter = Arc::new(Mutex::new(0));
            let mut handles = vec![];

            for _ in 0..10 {
                let counter = Arc::clone(&counter);
                let handle = thread::spawn(move || {
                    let mut num = counter.lock().unwrap();
                    *num += 1;
                });
                handles.push(handle);
            }

            for handle in handles {
                handle.join().unwrap();
            }

            println!("Result: {}", *counter.lock().unwrap());
        }
        ---

1.3 读写锁:RwLock

01.RwLock基本概念
    a.定义
        RwLock允许多个读者或一个写者,提高读多写少场景的并发性。
    b.代码示例
        ---
        use std::sync::RwLock;

        fn main() {
            let lock = RwLock::new(5);
            {
                let r1 = lock.read().unwrap();
                let r2 = lock.read().unwrap();
                println!("{} {}", *r1, *r2);
            }
            {
                let mut w = lock.write().unwrap();
                *w += 1;
            }
        }
        ---

02.读写分离
    a.功能说明
        多个线程可以同时持有读锁,但写锁是独占的。
    b.代码示例
        ---
        use std::sync::{Arc, RwLock};
        use std::thread;

        fn main() {
            let data = Arc::new(RwLock::new(vec![1, 2, 3]));
            let mut handles = vec![];

            for i in 0..5 {
                let data = Arc::clone(&data);
                let handle = thread::spawn(move || {
                    let v = data.read().unwrap();
                    println!("Reader {}: {:?}", i, *v);
                });
                handles.push(handle);
            }

            for handle in handles {
                handle.join().unwrap();
            }
        }
        ---

1.4 条件变量:Condvar

01.Condvar概念
    a.定义
        条件变量用于线程间的通知机制,配合Mutex使用。
    b.代码示例
        ---
        use std::sync::{Arc, Mutex, Condvar};
        use std::thread;

        fn main() {
            let pair = Arc::new((Mutex::new(false), Condvar::new()));
            let pair2 = Arc::clone(&pair);

            thread::spawn(move || {
                let (lock, cvar) = &*pair2;
                let mut started = lock.lock().unwrap();
                *started = true;
                cvar.notify_one();
            });

            let (lock, cvar) = &*pair;
            let mut started = lock.lock().unwrap();
            while !*started {
                started = cvar.wait(started).unwrap();
            }
        }
        ---

1.5 原子操作:Atomic

01.原子类型
    a.定义
        原子类型提供无锁的线程安全操作。
    b.代码示例
        ---
        use std::sync::atomic::{AtomicUsize, Ordering};
        use std::sync::Arc;
        use std::thread;

        fn main() {
            let counter = Arc::new(AtomicUsize::new(0));
            let mut handles = vec![];

            for _ in 0..10 {
                let counter = Arc::clone(&counter);
                let handle = thread::spawn(move || {
                    counter.fetch_add(1, Ordering::SeqCst);
                });
                handles.push(handle);
            }

            for handle in handles {
                handle.join().unwrap();
            }

            println!("Result: {}", counter.load(Ordering::SeqCst));
        }
        ---

1.6 锁的性能对比

01.性能对比
    a.Mutex
        适合任何场景,性能中等。
    b.RwLock
        读多写少场景性能优异。
    c.Atomic
        无锁,性能最高,但功能有限。

02.选择建议
    a.简单计数器
        使用Atomic。
    b.复杂数据结构
        使用Mutex。
    c.读多写少
        使用RwLock。

1.7 死锁问题

01.死锁概念
    a.定义
        多个线程互相等待对方释放锁,导致程序永久阻塞。
    b.预防方法
        按固定顺序获取锁。
        使用try_lock避免阻塞。
        使用超时机制。

02.代码示例
    a.死锁示例
        ---
        use std::sync::{Arc, Mutex};
        use std::thread;

        fn main() {
            let lock1 = Arc::new(Mutex::new(0));
            let lock2 = Arc::new(Mutex::new(0));

            let l1 = Arc::clone(&lock1);
            let l2 = Arc::clone(&lock2);
            thread::spawn(move || {
                let _g1 = l1.lock().unwrap();
                let _g2 = l2.lock().unwrap();
            });

            let _g2 = lock2.lock().unwrap();
            let _g1 = lock1.lock().unwrap();
        }
        ---

2 Mutex详解

2.1 基本用法

01.创建Mutex
    a.功能说明
        使用Mutex::new()创建互斥锁。
    b.代码示例
        ---
        use std::sync::Mutex;

        fn main() {
            let m = Mutex::new(5);
            let mut num = m.lock().unwrap();
            *num = 6;
            println!("{}", *num);
        }
        ---

2.2 lock与try_lock

01.lock方法
    a.功能说明
        阻塞等待直到获取锁。
    b.代码示例
        ---
        use std::sync::Mutex;

        fn main() {
            let m = Mutex::new(0);
            let guard = m.lock().unwrap();
            println!("{}", *guard);
        }
        ---

02.try_lock方法
    a.功能说明
        尝试获取锁,立即返回。
    b.代码示例
        ---
        use std::sync::Mutex;

        fn main() {
            let m = Mutex::new(0);
            match m.try_lock() {
                Ok(guard) => println!("Got lock: {}", *guard),
                Err(_) => println!("Could not get lock"),
            }
        }
        ---

2.3 MutexGuard与RAII

01.MutexGuard
    a.定义
        MutexGuard是lock()返回的守卫,离开作用域时自动释放锁。
    b.代码示例
        ---
        use std::sync::Mutex;

        fn main() {
            let m = Mutex::new(5);
            {
                let mut guard = m.lock().unwrap();
                *guard += 1;
            } // guard在此处自动释放
            println!("{:?}", m);
        }
        ---

2.4 跨线程共享:Arc-Mutex

01.Arc包装
    a.功能说明
        使用Arc实现Mutex的跨线程共享。
    b.代码示例
        ---
        use std::sync::{Arc, Mutex};
        use std::thread;

        fn main() {
            let data = Arc::new(Mutex::new(0));
            let mut handles = vec![];

            for _ in 0..10 {
                let data = Arc::clone(&data);
                let handle = thread::spawn(move || {
                    let mut num = data.lock().unwrap();
                    *num += 1;
                });
                handles.push(handle);
            }

            for handle in handles {
                handle.join().unwrap();
            }

            println!("Result: {}", *data.lock().unwrap());
        }
        ---

2.5 内部可变性

01.内部可变性模式
    a.定义
        Mutex提供内部可变性,允许通过不可变引用修改数据。
    b.代码示例
        ---
        use std::sync::Mutex;

        struct Counter {
            count: Mutex<i32>,
        }

        impl Counter {
            fn increment(&self) {
                let mut count = self.count.lock().unwrap();
                *count += 1;
            }
        }

        fn main() {
            let counter = Counter { count: Mutex::new(0) };
            counter.increment();
            println!("{}", *counter.count.lock().unwrap());
        }
        ---

2.6 poisoning机制

01.Poison概念
    a.定义
        当持有锁的线程panic时,锁会被标记为poisoned。
    b.代码示例
        ---
        use std::sync::{Arc, Mutex};
        use std::thread;

        fn main() {
            let lock = Arc::new(Mutex::new(0));
            let lock2 = Arc::clone(&lock);

            let _ = thread::spawn(move || {
                let _guard = lock2.lock().unwrap();
                panic!("thread panicked");
            }).join();

            match lock.lock() {
                Ok(_) => println!("Lock acquired"),
                Err(e) => println!("Lock poisoned: {:?}", e),
            }
        }
        ---

2.7 常见错误

01.忘记释放锁
    a.问题
        持有锁的时间过长导致性能问题。
    b.解决方案
        使用作用域限制锁的持有时间。

02.死锁
    a.问题
        多个锁的获取顺序不一致。
    b.解决方案
        统一锁的获取顺序。

3 RwLock详解

3.1 基本用法

01.创建RwLock
    a.功能说明
        使用RwLock::new()创建读写锁。
    b.代码示例
        ---
        use std::sync::RwLock;

        fn main() {
            let lock = RwLock::new(5);
            let r = lock.read().unwrap();
            println!("{}", *r);
        }
        ---

3.2 读锁与写锁

01.读锁
    a.功能说明
        多个线程可以同时持有读锁。
    b.代码示例
        ---
        use std::sync::RwLock;

        fn main() {
            let lock = RwLock::new(5);
            let r1 = lock.read().unwrap();
            let r2 = lock.read().unwrap();
            println!("{} {}", *r1, *r2);
        }
        ---

02.写锁
    a.功能说明
        写锁是独占的,同一时刻只能有一个写者。
    b.代码示例
        ---
        use std::sync::RwLock;

        fn main() {
            let lock = RwLock::new(5);
            let mut w = lock.write().unwrap();
            *w += 1;
            println!("{}", *w);
        }
        ---

3.3 read、write、try_read、try_write

01.阻塞方法
    a.read()
        阻塞等待获取读锁。
    b.write()
        阻塞等待获取写锁。

02.非阻塞方法
    a.try_read()
        尝试获取读锁,立即返回。
    b.try_write()
        尝试获取写锁,立即返回。
    c.代码示例
        ---
        use std::sync::RwLock;

        fn main() {
            let lock = RwLock::new(5);
            match lock.try_read() {
                Ok(guard) => println!("Read: {}", *guard),
                Err(_) => println!("Could not read"),
            }
        }
        ---

3.4 RwLockReadGuard与RwLockWriteGuard

01.Guard类型
    a.RwLockReadGuard
        读锁的守卫类型。
    b.RwLockWriteGuard
        写锁的守卫类型。
    c.代码示例
        ---
        use std::sync::RwLock;

        fn main() {
            let lock = RwLock::new(vec![1, 2, 3]);
            {
                let r = lock.read().unwrap();
                println!("{:?}", *r);
            }
            {
                let mut w = lock.write().unwrap();
                w.push(4);
            }
        }
        ---

3.5 适用场景

01.读多写少
    a.场景
        配置数据、缓存数据等读操作远多于写操作的场景。
    b.优势
        多个读者可以并发访问,提高性能。

02.性能对比
    a.RwLock vs Mutex
        读多写少场景RwLock性能更好。
        写操作频繁时Mutex可能更简单。

3.6 性能优化

01.减少写锁持有时间
    a.建议
        尽快释放写锁,避免阻塞读者。
    b.代码示例
        ---
        use std::sync::RwLock;

        fn main() {
            let lock = RwLock::new(vec![1, 2, 3]);
            {
                let mut w = lock.write().unwrap();
                w.push(4);
            } // 立即释放写锁
        }
        ---

3.7 公平性问题

01.写者饥饿
    a.问题
        大量读者可能导致写者长时间无法获取锁。
    b.解决方案
        使用parking_lot等第三方库提供公平锁。

4 原子类型

4.1 原子操作概念

01.原子性
    a.定义
        原子操作是不可分割的操作,要么全部完成,要么全部不完成。
    b.特点
        无锁、高性能、线程安全。

4.2 AtomicBool、AtomicI32、AtomicU64

01.原子类型
    a.AtomicBool
        原子布尔类型。
    b.AtomicI32
        原子有符号32位整数。
    c.AtomicU64
        原子无符号64位整数。
    d.代码示例
        ---
        use std::sync::atomic::{AtomicBool, AtomicI32, Ordering};

        fn main() {
            let flag = AtomicBool::new(false);
            flag.store(true, Ordering::SeqCst);
            println!("{}", flag.load(Ordering::SeqCst));

            let counter = AtomicI32::new(0);
            counter.fetch_add(1, Ordering::SeqCst);
            println!("{}", counter.load(Ordering::SeqCst));
        }
        ---

4.3 内存顺序:Ordering

01.Ordering类型
    a.Relaxed
        最宽松的内存顺序。
    b.Acquire
        获取语义。
    c.Release
        释放语义。
    d.SeqCst
        顺序一致性,最严格。
    e.代码示例
        ---
        use std::sync::atomic::{AtomicUsize, Ordering};

        fn main() {
            let counter = AtomicUsize::new(0);
            counter.store(1, Ordering::Relaxed);
            let value = counter.load(Ordering::Relaxed);
            println!("{}", value);
        }
        ---

4.4 load与store

01.load操作
    a.功能说明
        原子地读取值。
    b.代码示例
        ---
        use std::sync::atomic::{AtomicUsize, Ordering};

        fn main() {
            let counter = AtomicUsize::new(5);
            let value = counter.load(Ordering::SeqCst);
            println!("{}", value);
        }
        ---

02.store操作
    a.功能说明
        原子地写入值。
    b.代码示例
        ---
        use std::sync::atomic::{AtomicUsize, Ordering};

        fn main() {
            let counter = AtomicUsize::new(0);
            counter.store(10, Ordering::SeqCst);
        }
        ---

4.5 compare_and_swap

01.CAS操作
    a.功能说明
        比较并交换,原子操作的基础。
    b.代码示例
        ---
        use std::sync::atomic::{AtomicUsize, Ordering};

        fn main() {
            let counter = AtomicUsize::new(5);
            let old = counter.compare_exchange(
                5, 10,
                Ordering::SeqCst,
                Ordering::SeqCst
            );
            println!("{:?}", old);
        }
        ---

4.6 fetch_add、fetch_sub

01.fetch_add
    a.功能说明
        原子地增加值并返回旧值。
    b.代码示例
        ---
        use std::sync::atomic::{AtomicUsize, Ordering};

        fn main() {
            let counter = AtomicUsize::new(0);
            let old = counter.fetch_add(1, Ordering::SeqCst);
            println!("Old: {}, New: {}", old, counter.load(Ordering::SeqCst));
        }
        ---

02.fetch_sub
    a.功能说明
        原子地减少值并返回旧值。
    b.代码示例
        ---
        use std::sync::atomic::{AtomicUsize, Ordering};

        fn main() {
            let counter = AtomicUsize::new(10);
            counter.fetch_sub(1, Ordering::SeqCst);
        }
        ---

4.7 无锁编程

01.无锁数据结构
    a.概念
        使用原子操作实现无锁的数据结构。
    b.优势
        避免锁的开销,提高并发性能。
    c.挑战
        实现复杂,需要深入理解内存模型。

5 高级同步原语

5.1 Barrier

01.Barrier概念
    a.定义
        屏障用于同步多个线程,等待所有线程到达屏障点。
    b.代码示例
        ---
        use std::sync::{Arc, Barrier};
        use std::thread;

        fn main() {
            let barrier = Arc::new(Barrier::new(3));
            let mut handles = vec![];

            for i in 0..3 {
                let b = Arc::clone(&barrier);
                let handle = thread::spawn(move || {
                    println!("Thread {} before barrier", i);
                    b.wait();
                    println!("Thread {} after barrier", i);
                });
                handles.push(handle);
            }

            for handle in handles {
                handle.join().unwrap();
            }
        }
        ---

5.2 Once与OnceLock

01.Once
    a.定义
        确保某个操作只执行一次。
    b.代码示例
        ---
        use std::sync::Once;

        static INIT: Once = Once::new();

        fn main() {
            INIT.call_once(|| {
                println!("This runs only once");
            });
        }
        ---

02.OnceLock
    a.定义
        线程安全的一次性初始化容器。
    b.代码示例
        ---
        use std::sync::OnceLock;

        static VALUE: OnceLock<i32> = OnceLock::new();

        fn main() {
            VALUE.set(42).unwrap();
            println!("{}", VALUE.get().unwrap());
        }
        ---

5.3 Semaphore

01.信号量
    a.定义
        控制同时访问资源的线程数量。
    b.使用tokio::sync::Semaphore
        ---
        use tokio::sync::Semaphore;
        use std::sync::Arc;

        #[tokio::main]
        async fn main() {
            let semaphore = Arc::new(Semaphore::new(3));
            let mut handles = vec![];

            for i in 0..10 {
                let permit = semaphore.clone();
                let handle = tokio::spawn(async move {
                    let _guard = permit.acquire().await.unwrap();
                    println!("Task {} acquired", i);
                });
                handles.push(handle);
            }

            for handle in handles {
                handle.await.unwrap();
            }
        }
        ---

5.4 Channel作为同步工具

01.Channel同步
    a.功能说明
        使用channel进行线程间通信和同步。
    b.代码示例
        ---
        use std::sync::mpsc;
        use std::thread;

        fn main() {
            let (tx, rx) = mpsc::channel();

            thread::spawn(move || {
                tx.send(42).unwrap();
            });

            let received = rx.recv().unwrap();
            println!("Received: {}", received);
        }
        ---

5.5 parking_lot库

01.parking_lot特点
    a.性能更好
        比标准库的锁性能更高。
    b.功能更丰富
        提供公平锁、超时等功能。
    c.代码示例
        ---
        use parking_lot::Mutex;

        fn main() {
            let m = Mutex::new(5);
            let mut guard = m.lock();
            *guard = 6;
        }
        ---

5.6 crossbeam同步工具

01.crossbeam库
    a.功能
        提供高性能的并发工具。
    b.代码示例
        ---
        use crossbeam::channel;
        use std::thread;

        fn main() {
            let (s, r) = channel::unbounded();

            thread::spawn(move || {
                s.send(42).unwrap();
            });

            println!("{}", r.recv().unwrap());
        }
        ---

5.7 自定义锁实现

01.自定义锁
    a.概念
        使用原子操作实现自定义锁。
    b.简单自旋锁示例
        ---
        use std::sync::atomic::{AtomicBool, Ordering};
        use std::cell::UnsafeCell;

        pub struct SpinLock<T> {
            locked: AtomicBool,
            data: UnsafeCell<T>,
        }

        unsafe impl<T: Send> Sync for SpinLock<T> {}

        impl<T> SpinLock<T> {
            pub fn new(data: T) -> Self {
                Self {
                    locked: AtomicBool::new(false),
                    data: UnsafeCell::new(data),
                }
            }

            pub fn lock(&self) -> &mut T {
                while self.locked.swap(true, Ordering::Acquire) {
                    std::hint::spin_loop();
                }
                unsafe { &mut *self.data.get() }
            }

            pub fn unlock(&self) {
                self.locked.store(false, Ordering::Release);
            }
        }
        ---