MST

星途 面试题库

面试题:Rust并行编程中Arc与Mutex的协同使用

在Rust并行编程场景下,假设有多个线程需要访问并修改同一个数据结构,如何通过`Arc`和`Mutex`来实现线程安全的访问?请给出一个简单示例代码,并解释`Arc`和`Mutex`各自的作用。
34.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

示例代码

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();
    }

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

Arc的作用

Arc即原子引用计数(Atomic Reference Counting),它允许在多个线程间共享数据。Arc内部维护一个引用计数,每当Arc被克隆(通过clone方法)时,引用计数增加;当Arc离开作用域时,引用计数减少。当引用计数为0时,其所指向的数据被释放。Arc提供了一种线程安全的方式来共享数据,使得多个线程可以同时持有对同一个数据结构的引用。

Mutex的作用

Mutex即互斥锁(Mutual Exclusion),它用于保护共享数据,确保在同一时间只有一个线程可以访问该数据。通过调用lock方法来获取锁,如果锁已经被其他线程持有,调用线程会被阻塞,直到锁被释放。一旦获得锁,线程可以对受保护的数据进行修改,完成操作后,锁会自动释放(当lock返回的MutexGuard离开作用域时)。这样可以避免多个线程同时修改数据导致的数据竞争问题,从而实现线程安全。