MST

星途 面试题库

面试题:Rust引用声明中的借用规则与多线程

Rust的借用规则保证内存安全,在多线程环境下,如果有多个线程同时尝试借用同一个数据,可能会违反借用规则。请描述如何在多线程中安全地使用引用,例如通过`Arc`和`Mutex`来实现,并给出一个简单示例代码,说明如何正确地在多线程中共享和修改一个数据结构。
49.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 使用ArcMutex在多线程中安全使用引用

    • Arc(原子引用计数)用于在多个线程间共享数据。它允许数据在多个线程间克隆,而其内部的引用计数机制保证当所有对数据的引用都消失时,数据会被正确释放。
    • Mutex(互斥锁)用于保护共享数据,确保在任何时刻只有一个线程可以访问被保护的数据。线程在访问数据前需要获取锁,访问完成后释放锁。这样就避免了多个线程同时修改数据导致的数据竞争问题。
  2. 示例代码

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

fn main() {
    // 创建一个包含整数的Arc<Mutex<i32>>
    let shared_data = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        // 克隆Arc,以便每个线程都能持有一个引用
        let data = Arc::clone(&shared_data);
        let handle = thread::spawn(move || {
            // 尝试获取Mutex的锁
            let mut num = data.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

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

    // 主线程获取锁并打印最终结果
    let final_result = shared_data.lock().unwrap();
    println!("Final result: {}", *final_result);
}

在上述代码中:

  • 首先创建了一个Arc<Mutex<i32>>类型的shared_data,初始值为0。
  • 然后通过for循环创建10个线程,每个线程克隆一份Arc并尝试获取Mutex的锁,获取成功后对内部的整数加1。
  • 主线程等待所有线程完成后,获取锁并打印最终的结果。这样通过ArcMutex确保了在多线程环境下对共享数据的安全访问和修改。