MST
星途 面试题库

面试题:Rust并发编程中Arc和Mutex的资源管理应用

在Rust并发编程里,Arc(原子引用计数)和Mutex(互斥锁)常被用于资源管理。请描述在一个多线程场景中,如何使用Arc和Mutex来安全地共享一个可变资源,并给出相应的代码示例,同时解释为什么这种组合能保证资源的安全访问。
38.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 如何使用
    • Arc用于在多个线程间共享资源的所有权,它提供原子引用计数,使得多个线程可以安全地持有对同一资源的引用。
    • Mutex用于保护共享资源,确保同一时间只有一个线程可以访问该资源,实现线程间的互斥访问。
    • 在多线程场景中,将需要共享的可变资源用Mutex包裹,然后再用Arc来持有这个包裹后的资源,这样多个线程就可以通过Arc来获取对Mutex包裹资源的引用,并通过Mutex的锁机制来安全地访问和修改资源。
  2. 代码示例
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 创建一个用Mutex包裹的i32类型资源,并使用Arc来持有
    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());
}
  1. 为什么这种组合能保证资源的安全访问
    • Arc负责在多个线程间安全地共享资源的所有权,它的原子引用计数机制确保在所有线程都不再使用资源时,资源能被正确释放。
    • Mutex提供了互斥访问控制,通过锁机制,同一时间只有一个线程可以获取锁并访问内部包裹的资源。其他线程在尝试获取锁时会被阻塞,直到锁被释放。这样就避免了多个线程同时访问和修改资源导致的数据竞争问题,从而保证了资源的安全访问。