Z
ZHANK
编程在线教程Rust 教程Mutex 与 Arc 共享状态
并发编程

Mutex 与 Arc 共享状态

Mutex<T> 互斥锁、Arc<Mutex<T>> 多线程共享、lock 返回 MutexGuard

Mutex 与 Arc 共享状态

Mutex<T> 保护数据——同一时刻只有一个线程能访问。配合 Arc 在多线程间共享。

学完本章你将: 掌握 Mutex lock、Arc<Mutex>、MutexGuard。


Mutex 基础

rust
use std::sync::Mutex;

fn main() {
    let m = Mutex::new(5);

    {
        let mut num = m.lock().unwrap();  // 获取锁
        *num = 6;                         // 修改
    }  // lock 离开作用域——自动释放

    println!("m = {:?}", m);  // Mutex { data: 6 }
}

Arc> —— 多线程共享

rust
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 h in handles {
        h.join().unwrap();
    }

    println!("结果: {}", *counter.lock().unwrap());  // 10
}

⚠️ lock() 会阻塞直到获取锁。如果同一个线程试图两次 lock,会死锁——用 try_lock() 避免。