MST

星途 面试题库

面试题:Rust中如何保证线程安全的共享可变数据访问

在Rust中,我们经常需要在线程间共享数据。请解释如何使用`Arc`和`Mutex`来安全地在线程间共享可变数据。请给出一个简单的代码示例,展示两个线程如何安全地修改共享数据。
37.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. ArcMutex的作用
    • Arc(原子引用计数,Atomic Reference Counting):用于在多个线程间共享数据。它允许数据有多个所有者,并且其引用计数操作是线程安全的。这意味着多个线程可以同时持有对同一数据的Arc指针,而不会产生数据竞争。
    • Mutex(互斥锁,Mutual Exclusion):用于保护数据,确保同一时间只有一个线程可以访问数据。当一个线程获取了Mutex的锁,其他线程必须等待该锁被释放后才能获取锁并访问数据。
  2. 代码示例
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 创建一个Arc<Mutex<i32>>类型的共享数据
    let data = Arc::new(Mutex::new(0));

    // 克隆Arc,以便每个线程都有自己的引用
    let data1 = data.clone();
    let data2 = data.clone();

    // 启动第一个线程
    let handle1 = thread::spawn(move || {
        let mut num = data1.lock().unwrap();
        *num += 1;
    });

    // 启动第二个线程
    let handle2 = thread::spawn(move || {
        let mut num = data2.lock().unwrap();
        *num += 2;
    });

    // 等待两个线程完成
    handle1.join().unwrap();
    handle2.join().unwrap();

    // 打印最终结果
    println!("Final value: {}", data.lock().unwrap());
}

在这个示例中:

  • 首先创建了一个Arc<Mutex<i32>>类型的变量data,其中Mutex保护着一个i32类型的数据,初始值为0。
  • 然后克隆了Arc,分别为data1data2,以便每个线程都可以持有对共享数据的引用。
  • 每个线程通过lock()方法获取Mutex的锁,这一步可能会阻塞,直到锁可用。获取锁后,返回一个智能指针,通过解引用可以修改内部的数据。
  • 最后等待两个线程完成,并打印出共享数据的最终值。由于Mutex的保护,两个线程不会同时修改数据,从而保证了线程安全。