MST
星途 面试题库

面试题:Rust中Mutex的基本使用及原理简述

请简述Rust中Mutex(互斥锁)的基本原理,并编写一段简单的Rust代码示例,展示如何使用Mutex来保护共享数据,同时解释为什么在使用Mutex时需要`lock`方法。
29.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Mutex基本原理

Mutex(互斥锁)是一种同步原语,其核心原理基于“互斥访问”。它确保在任何时刻,只有一个线程能够访问被它保护的数据。当一个线程想要访问共享数据时,必须先获取Mutex的锁。如果锁已被其他线程持有,那么该线程会被阻塞,直到锁被释放。这种机制防止了多个线程同时修改共享数据,从而避免数据竞争和未定义行为。

代码示例

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let data = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let data_clone = Arc::clone(&data);
        let handle = thread::spawn(move || {
            let mut num = data_clone.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Final value: {}", *data.lock().unwrap());
}

lock方法的作用

在使用Mutex时需要lock方法,因为lock方法尝试获取Mutex的锁。如果锁可用,该方法会返回一个MutexGuard智能指针,它实现了DerefDerefMut trait,这样就可以像操作普通数据一样操作被保护的数据。当MutexGuard离开作用域时,它会自动释放锁,从而允许其他线程获取锁并访问共享数据。如果不调用lock方法,就无法获取对共享数据的独占访问权,也就无法保证数据的一致性和线程安全性。