MST

星途 面试题库

面试题:Rust中如何创建和使用非作用域互斥体

请描述在Rust中创建非作用域互斥体(如`Mutex`)的基本步骤,并举例说明在多线程环境下如何安全地访问受互斥体保护的数据。
26.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 创建非作用域互斥体的基本步骤

    • 引入 std::sync::Mutex 模块。在Rust中,Mutex 是标准库提供的用于线程同步的工具,要使用它需要先引入相关模块。
    • 使用 Mutex::new 方法创建一个 Mutex 实例,将需要保护的数据作为参数传递给 new 方法。
  2. 多线程环境下安全访问受互斥体保护的数据示例

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

fn main() {
    // 创建一个Mutex,保护一个i32类型的数据
    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 || {
            // 锁定Mutex,获取内部数据的可变引用
            let mut num = data_clone.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

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

    // 主线程中访问受保护的数据
    let result = data.lock().unwrap();
    println!("Final result: {}", *result);
}

在上述代码中:

  • 首先通过 Arc::new(Mutex::new(0)) 创建了一个 Mutex 实例,保护一个初始值为0的 i32 类型数据,并使用 Arc 来在多个线程间共享这个 Mutex
  • 然后创建10个线程,每个线程通过 data_clone.lock().unwrap() 来锁定 Mutex,获取内部数据的可变引用,对其进行加1操作。这里 lock 方法返回一个 Result,使用 unwrap 简单处理错误,如果锁定失败会导致程序崩溃,在实际应用中可以更优雅地处理错误。
  • 主线程通过 handle.join() 等待所有线程执行完毕,最后通过 data.lock().unwrap() 获取并打印最终结果。