Rust 学习笔记 22:共享状态并发 (Shared-State Concurrency)
Rust 学习笔记 22:共享状态并发 (Shared-State Concurrency) “Do not communicate by sharing memory; instead, share memory by communicating.” – Go Language Slogan 虽然 Go 倡导通过通信来共享内存(Channel),但 Rust 同样提供了强大的共享状态并发工具。而且得益于所有权系统,Rust 中的锁是线程安全的(Thread Safety),你很难写出有数据竞争的代码。 1. Mutex (互斥锁) Mutex (Mutual Exclusion) 让同一时刻只有一个线程访问数据。 Rust 的 Mutex 有两个特点: 必须要先获取锁,才能通过解引用访问内部数据。这保证了你如果不加锁,根本拿不到数据(编译器按头让你加锁)。 RAII:锁的释放在 Guard 离开作用域时自动发生,不需要手动 unlock。 1let m = Mutex::new(5); 2{ 3 let mut num = m.lock().unwrap(); // 获取锁,num 是 MutexGuard 4 *num = 6; // 修改数据 5} // 离开作用域,锁自动释放 2. 原子引用计数 Arc 要在多个线程间共享 Mutex,直接传是不行的(所有权规则)。 你可能会想到 Rc<T>,但 Rc 不是线程安全的。 我们需要 Arc<T> (Atomic Reference Counting)。 ...