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 就像是只有一個元素的集合,也就是受保護的資料。
    • 必須先取得互斥鎖,才能存取受保護的資料。
  • 只要使用這個鎖,就能從 &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 的執行緒發生恐慌,Mutex 就會「中毒」,指出 其保護的資料可能處於不一致的狀態。如果對已中毒的互斥鎖呼叫 lock(), 會發生 PoisonError 錯誤。無論如何,你都可以對錯誤呼叫 into_inner() 來復原 資料。