MST

星途 面试题库

面试题:Rust中多重借用在并发场景下如何保证数据一致性

请阐述在Rust中,当存在多重借用时,如何在并发环境下保证数据的一致性。可以结合Arc、Mutex等相关类型进行说明,并且给出一个简单的代码示例来展示这种机制的应用。
39.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 数据一致性保证原理
    • 在Rust并发环境下,多重借用时保证数据一致性主要依赖于智能指针和同步原语。
    • Arc(原子引用计数指针)用于在多个线程间共享数据,它允许数据在多个所有者之间共享。Arc本身是线程安全的,但是它只提供了共享所有权,并不保证数据的读写安全。
    • Mutex(互斥锁)用于保护共享数据,确保同一时间只有一个线程可以访问数据。当一个线程获取了Mutex的锁,其他线程必须等待锁释放后才能访问数据,这样就保证了数据的一致性。
  2. 代码示例
use std::sync::{Arc, Mutex};
use std::thread;

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

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

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

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

在上述代码中:

  • 首先创建了一个Arc包裹的Mutex,内部包含一个初始值为0的整数。
  • 然后创建10个线程,每个线程克隆Arc并获取Mutex的锁(通过lock方法,返回一个Result,这里使用unwrap简单处理错误),对共享数据进行加1操作。
  • 主线程等待所有线程执行完毕,最后获取并打印共享数据的最终值。这样通过ArcMutex的配合,在多重借用的并发环境下保证了数据的一致性。