MST

星途 面试题库

面试题:Rust结构体可变性并发控制中Arc和Mutex的使用

给定一个Rust结构体`SharedData`,它包含多个复杂类型的字段。要求在多个线程间共享这个结构体,并且允许线程对其进行修改操作。请使用`Arc`和`Mutex`实现该需求,并说明为什么选择这两个类型,以及它们在并发控制中的作用。
28.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 代码实现
    use std::sync::{Arc, Mutex};
    
    // 假设复杂类型字段,这里用String举例
    struct SharedData {
        field1: String,
        field2: String,
    }
    
    fn main() {
        let shared_data = Arc::new(Mutex::new(SharedData {
            field1: "initial value1".to_string(),
            field2: "initial value2".to_string(),
        }));
    
        let handle = std::thread::spawn({
            let shared_data = shared_data.clone();
            move || {
                let mut data = shared_data.lock().unwrap();
                data.field1 = "new value1".to_string();
            }
        });
    
        handle.join().unwrap();
    
        let data = shared_data.lock().unwrap();
        println!("field1: {}, field2: {}", data.field1, data.field2);
    }
    
  2. 选择ArcMutex的原因
    • Arc(原子引用计数):用于在多个线程间共享数据。Arc通过引用计数来管理数据的生命周期,当引用计数为0时,数据被自动释放。它的原子性保证了在多线程环境下引用计数操作的安全性,使得多个线程可以安全地持有对同一份数据的引用。
    • Mutex(互斥锁):用于保护共享数据,确保在同一时刻只有一个线程可以访问和修改数据。当一个线程获取到Mutex的锁时,其他线程必须等待锁的释放才能访问数据,从而避免了数据竞争问题。
  3. 它们在并发控制中的作用
    • Arc:主要解决了数据在多线程间的共享问题,使得不同线程可以访问同一份数据实例。
    • Mutex:在数据共享的基础上,通过互斥访问机制,保证了数据的一致性和完整性。多个线程不能同时修改共享数据,避免了竞态条件(race condition)的发生。