面试题答案
一键面试- 代码实现:
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); }
- 选择
Arc
和Mutex
的原因:Arc
(原子引用计数):用于在多个线程间共享数据。Arc
通过引用计数来管理数据的生命周期,当引用计数为0时,数据被自动释放。它的原子性保证了在多线程环境下引用计数操作的安全性,使得多个线程可以安全地持有对同一份数据的引用。Mutex
(互斥锁):用于保护共享数据,确保在同一时刻只有一个线程可以访问和修改数据。当一个线程获取到Mutex
的锁时,其他线程必须等待锁的释放才能访问数据,从而避免了数据竞争问题。
- 它们在并发控制中的作用:
Arc
:主要解决了数据在多线程间的共享问题,使得不同线程可以访问同一份数据实例。Mutex
:在数据共享的基础上,通过互斥访问机制,保证了数据的一致性和完整性。多个线程不能同时修改共享数据,避免了竞态条件(race condition)的发生。