MST

星途 面试题库

面试题:Rust中如何在并发环境下安全地获取和修改数据

请描述在Rust中,使用`Mutex`和`Arc`实现多线程安全获取和修改数据的基本步骤,并给出一个简单示例代码。
47.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 基本步骤
    • 引入必要的库:在Rust中,MutexArc都来自标准库,因此只需在文件开头引入它们,通常使用use std::sync::{Mutex, Arc};
    • 创建共享数据:用Mutex包裹需要共享的数据,因为Mutex提供了互斥访问的机制。然后将这个Mutex实例用Arc进行包裹,Arc是原子引用计数指针,用于在多个线程间安全地共享数据。
    • 在不同线程中操作数据:在每个线程中,通过Arc获取Mutex的引用,然后使用lock方法获取锁。一旦获取到锁,就可以安全地访问和修改Mutex包裹的数据。操作完成后,锁会自动释放(通过MutexGuard的析构函数)。
  2. 示例代码
use std::sync::{Mutex, Arc};
use std::thread;

fn main() {
    // 创建一个用Mutex包裹的共享数据,并使用Arc来共享
    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();
    }

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

在这个示例中,我们创建了一个共享的Mutex<i32>,初始值为0。然后我们启动10个线程,每个线程获取锁,将数据加1。最后,主线程等待所有线程完成,并打印最终的结果。