MST

星途 面试题库

面试题:Rust中Mutex的基本使用场景

请描述在Rust中Mutex(互斥锁)主要用于解决什么类型的并发问题?并举例说明一个简单场景下如何使用Mutex来保护共享数据。
35.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Mutex解决的并发问题类型

Mutex(互斥锁)主要用于解决多个线程同时访问共享数据时可能产生的数据竞争问题。数据竞争会导致程序出现未定义行为,比如数据不一致、程序崩溃等。Mutex通过只允许一个线程在同一时间内访问共享数据,确保共享数据在多线程环境下的一致性和安全性。

简单场景及使用示例

假设我们有一个共享的计数器,多个线程需要对其进行递增操作。以下是使用Mutex保护共享计数器的示例代码:

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

    let result = counter.lock().unwrap();
    println!("Final counter value: {}", *result);
}

在这个例子中,Arc<Mutex<i32>> 用于创建一个可在多个线程间共享的计数器,Mutex 确保每次只有一个线程能获取锁并修改计数器的值,从而避免数据竞争。lock 方法尝试获取锁,如果锁可用则返回一个 MutexGuard,通过解引用 MutexGuard 可以访问和修改内部数据。操作完成后,MutexGuard 离开作用域,自动释放锁,允许其他线程获取锁并操作共享数据。