MST

星途 面试题库

面试题:Rust并发集合中的Arc和Mutex如何协同工作

在Rust中,Arc(原子引用计数)和Mutex(互斥锁)常被用于实现线程安全的并发集合。请解释Arc和Mutex各自的作用,并且描述它们是如何协同工作来确保多线程环境下数据的安全访问的。同时,给出一个简单的代码示例展示这种协同使用。
29.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

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

Arc 即 Atomic Reference Counting,用于在多线程环境下共享数据。它通过原子操作来管理引用计数,允许多个线程持有对同一数据的引用。当最后一个引用被销毁时,数据才会被释放,这使得数据可以在多个线程间安全地共享。

Mutex(互斥锁)的作用

Mutex 即 Mutual Exclusion,是一种同步原语。它的作用是保证在同一时刻只有一个线程能够访问被其保护的数据。当一个线程获取了 Mutex 的锁,其他线程必须等待该锁被释放后才能获取并访问数据,从而避免数据竞争。

协同工作原理

Arc 用于在多个线程间共享数据,而 Mutex 用于保护被共享的数据,确保同一时间只有一个线程可以对数据进行修改或读取,从而实现多线程环境下数据的安全访问。

代码示例

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 || {
            // 获取锁,如果锁被占用则等待
            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());
}

在这个示例中,Arc<Mutex<i32>> 被多个线程共享。每个线程通过 lock() 方法获取 Mutex 的锁,对共享数据进行修改,完成后锁自动释放,确保了数据在多线程环境下的安全访问。