MST

星途 面试题库

面试题:Rust商店示例中线程间数据共享的实现方式

在Rust商店示例中,假设不同线程需要访问和修改商店的库存数据,描述如何安全地实现线程间的数据共享,并说明使用到的相关Rust特性和机制。
33.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 使用ArcMutex实现线程安全的数据共享
    • Arc(原子引用计数)ArcRust标准库提供的用于在多个线程间共享数据的智能指针。它通过引用计数来管理数据的生命周期,并且其引用计数操作是原子的,所以可以安全地在多个线程间传递。
    • Mutex(互斥锁)Mutex用于保护共享数据,确保在同一时间只有一个线程可以访问和修改数据。当一个线程获取到Mutex的锁时,其他线程必须等待锁被释放才能访问数据。
  2. 示例代码
    use std::sync::{Arc, Mutex};
    use std::thread;
    
    // 商店库存数据结构
    struct StoreInventory {
        items: Vec<String>,
        quantity: u32,
    }
    
    fn main() {
        // 创建Arc<Mutex<StoreInventory>>实例
        let inventory = Arc::new(Mutex::new(StoreInventory {
            items: vec!["item1".to_string(), "item2".to_string()],
            quantity: 100,
        }));
    
        let mut handles = vec![];
        for _ in 0..10 {
            let inventory_clone = Arc::clone(&inventory);
            let handle = thread::spawn(move || {
                let mut inv = inventory_clone.lock().unwrap();
                // 模拟线程对库存数据的修改
                inv.quantity -= 1;
            });
            handles.push(handle);
        }
    
        for handle in handles {
            handle.join().unwrap();
        }
    
        let final_inv = inventory.lock().unwrap();
        println!("Final quantity: {}", final_inv.quantity);
    }
    
  3. 解释
    • 首先定义了StoreInventory结构体来表示商店库存数据。
    • 使用Arc<Mutex<StoreInventory>>来创建共享的库存数据实例。Arc用于跨线程共享,Mutex用于保护数据。
    • for循环中,每个线程获取Arc的克隆并尝试获取Mutex的锁。如果获取成功(通过lock().unwrap(),实际应用中应更好地处理锁获取失败的情况),则可以安全地修改库存数据。
    • 最后等待所有线程完成,并打印最终的库存数量。
  4. 总结
    • 通过ArcMutex的组合,Rust能够安全地实现线程间的数据共享和修改。Arc确保数据在多个线程间正确地共享生命周期,Mutex保证同一时间只有一个线程可以修改数据,从而避免数据竞争问题。