当前位置:嗨网首页>书籍在线阅读

12-互斥

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.4.2 互斥

当需要安全地对共享资源进行可变访问时,可以通过互斥来提供访问。互斥锁(mutex)是mutual和exclusion的缩写,是一种广泛使用的同步原语,用于确保一段代码一次只能有一个线程执行。通常,互斥锁是一个守护对象,线程获取该对象以保护要由多个线程共享或修改的数据。它的工作原理是通过锁定值来禁止一次访问多个线程中的值。如果其中一个线程对互斥锁类型执行了锁定,那么任何其他线程都不能运行相同的代码,直到持有该锁定的线程完成为止。

标准库中的std::sync模块包含Mutex类型,允许用户以线程安全的方式改变线程中的数据。

以下代码示例演示了如何在单个子线程中使用Mutex类型:

// mutex_basics.rs
use std::sync::Mutex;
use std::thread;
fn main() {
    let m = Mutex::new(0);
    let c = thread::spawn(move || {
        {
            *m.lock().unwrap() += 1;
        }
        let updated = *m.lock().unwrap();
        updated
    });
    let updated = c.join().unwrap();
    println!("{:?}", updated);
}

上述代码能够按照预期正常运行。但是当多个线程尝试访问该值时,这将无效,因为Mutex类型不提供共享可变性。为了允许Mutex类型中的值支持在多线程环境下被修改,我们需要将它包装成Arc类型。接下来让我们看看如何做到这一点。