面试题答案
一键面试在Rust的并发编程中,常用的线程同步机制有:
- Mutex(互斥锁):用于保护共享数据,同一时间只有一个线程可以获取锁来访问数据,防止数据竞争。
- RwLock(读写锁):允许多个线程同时读数据,但只允许一个线程写数据。适用于读多写少的场景。
- Condvar(条件变量):用于线程间的条件同步,一个线程等待某个条件满足,其他线程可以通知条件变量,唤醒等待的线程。
- Channel(通道):用于线程间传递数据,实现生产者 - 消费者模型。
以下是使用 Mutex
和 Arc
结合来实现线程安全的数据共享的示例:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个Arc<Mutex<i32>>类型的共享数据
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
// 克隆Arc
let data_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
// 尝试获取锁
let mut num = data_clone.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 打印最终结果
println!("Final value: {}", *data.lock().unwrap());
}
在上述代码中:
- 使用
Arc
来实现数据的共享所有权,使得多个线程可以持有对同一数据的引用。 - 使用
Mutex
来保护共享数据i32
,确保同一时间只有一个线程能够修改它。 - 通过
Arc::clone
克隆Arc
,以便每个线程都能持有数据的引用。 - 每个线程通过
lock
方法获取MutexGuard
来访问和修改数据,unwrap
用于处理获取锁失败的情况(实际应用中可能需要更优雅的错误处理)。 - 主线程等待所有子线程完成后,打印最终的共享数据值。