面试题答案
一键面试- 使用
Arc
和Mutex
实现线程安全的数据共享Arc
(原子引用计数):Arc
是Rust
标准库提供的用于在多个线程间共享数据的智能指针。它通过引用计数来管理数据的生命周期,并且其引用计数操作是原子的,所以可以安全地在多个线程间传递。Mutex
(互斥锁):Mutex
用于保护共享数据,确保在同一时间只有一个线程可以访问和修改数据。当一个线程获取到Mutex
的锁时,其他线程必须等待锁被释放才能访问数据。
- 示例代码
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); }
- 解释
- 首先定义了
StoreInventory
结构体来表示商店库存数据。 - 使用
Arc<Mutex<StoreInventory>>
来创建共享的库存数据实例。Arc
用于跨线程共享,Mutex
用于保护数据。 - 在
for
循环中,每个线程获取Arc
的克隆并尝试获取Mutex
的锁。如果获取成功(通过lock().unwrap()
,实际应用中应更好地处理锁获取失败的情况),则可以安全地修改库存数据。 - 最后等待所有线程完成,并打印最终的库存数量。
- 首先定义了
- 总结
- 通过
Arc
和Mutex
的组合,Rust
能够安全地实现线程间的数据共享和修改。Arc
确保数据在多个线程间正确地共享生命周期,Mutex
保证同一时间只有一个线程可以修改数据,从而避免数据竞争问题。
- 通过