互斥器 (Mutex)

Mutex<T> 能够确保互斥,并允许对只读接口 后面的 T 进行可变访问:

use std::sync::Mutex;

fn main() {
    let v = Mutex::new(vec![10, 20, 30]);
    println!("v: {:?}", v.lock().unwrap());

    {
        let mut guard = v.lock().unwrap();
        guard.push(40);
    }

    println!("v: {:?}", v.lock().unwrap());
}

请注意我们如何设置 impl<T: Send> Sync for Mutex<T> 通用 实现。

  • Rust 中的互斥器看起来就像只包含一个元素的集合,其中的元素就是受保护的数据。
    • 在访问受保护的数据之前不可能忘记获取互斥量。
  • 你可以通过获取锁,从 &Mutex<T> 中获取 &mut TMutexGuard 能够确保 &mut T 存在的时间不会比持有锁的时间更长。
  • Mutex<T> implements both Send and Sync iff (if and only if) T implements Send.
  • 读写锁版本 - RwLock
  • 为什么 lock() 会返回 Result
    • 如果持有 Mutex 的线程发生panic,Mutex 便会“中毒”并发出信号, 表明其所保护的数据可能处于不一致状态。对中毒的互斥量调用 lock() 将会失败, 并将显示 PoisonError。无论如何,你可以对该错误调用 into_inner() 来 恢复数据。