MST
星途 面试题库

面试题:Rust借用机制在并发场景中的基础应用

请描述在Rust中,如何使用借用机制来确保并发环境下的数据安全。假设有一个共享的可变数据结构,在多线程环境中,如何通过借用规则来防止数据竞争?请给出一个简单的代码示例并解释其原理。
43.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 代码示例
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();
    }

    println!("Final value: {}", *shared_data.lock().unwrap());
}
  1. 原理解释
    • Arc (原子引用计数): Arc 用于在多个线程间共享数据。它是线程安全的引用计数指针,允许多个线程拥有数据的只读引用。在这里,Arc 包裹了 Mutex
    • Mutex (互斥锁): Mutex 即互斥访问,它通过锁定机制来保证同一时间只有一个线程可以访问其包裹的数据。在 Rust 中,获取锁是通过 lock 方法,该方法返回一个 Result,因为锁可能会被其他线程占用。unwrap 方法用于简单地处理这个 Result,实际应用中可能需要更稳健的错误处理。
    • 借用规则应用: 在 Rust 中,借用规则规定同一时间只能有一个可变借用(写操作)或多个不可变借用(读操作)。Mutex 利用了这一规则,通过锁定机制来模拟可变借用。当一个线程调用 lock 方法并成功获取锁时,就相当于获得了一个可变借用,其他线程此时无法获取锁(无法获得可变借用),从而防止了数据竞争。当线程完成对数据的操作并释放锁时,其他线程才有机会获取锁并操作数据。