MST
星途 面试题库

面试题:Rust中Arc和Mutex如何实现共享所有权与并发安全

在Rust中,Arc(原子引用计数)和Mutex(互斥锁)是实现共享所有权与并发安全的重要工具。请阐述Arc和Mutex各自的作用,并且通过一段简单的代码示例,展示如何使用Arc和Mutex来安全地在多个线程间共享数据。
36.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Arc(原子引用计数)的作用

Arc 用于在多个线程间共享数据的所有权。它通过原子引用计数机制,确保只有当最后一个指向数据的引用被释放时,数据才会被销毁。这使得数据可以安全地在多个线程间传递,实现共享所有权。

Mutex(互斥锁)的作用

Mutex 用于保护共享数据,确保在同一时间只有一个线程可以访问数据。它通过互斥访问机制,防止多个线程同时修改共享数据,从而避免数据竞争和不一致问题,实现并发安全。

代码示例

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

fn main() {
    // 创建一个 Arc 包裹的 Mutex,内部包含一个 i32 类型的数据
    let data = Arc::new(Mutex::new(0));

    let mut handles = vec![];

    for _ in 0..10 {
        // 克隆 Arc
        let data_clone = Arc::clone(&data);
        let handle = thread::spawn(move || {
            // 尝试获取 Mutex 的锁
            let mut num = data_clone.lock().unwrap();
            // 修改数据
            *num += 1;
        });
        handles.push(handle);
    }

    // 等待所有线程完成
    for handle in handles {
        handle.join().unwrap();
    }

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

在上述代码中,我们首先创建了一个 Arc<Mutex<i32>>,然后在 10 个线程中尝试获取 Mutex 的锁并修改内部数据。通过 Arc 实现数据在多个线程间的共享所有权,通过 Mutex 确保同一时间只有一个线程可以修改数据,从而实现了安全的多线程数据共享。