面试题答案
一键面试常用确保线程安全共享数据的机制
Mutex
(互斥锁):Mutex
用于保护数据,确保同一时间只有一个线程可以访问被它包裹的数据。当一个线程获取了Mutex
的锁,其他线程必须等待锁被释放才能访问数据,以此避免数据竞争。
Arc
(原子引用计数):Arc
用于在多个线程间共享数据的所有权。它通过引用计数跟踪有多少个变量持有数据的引用,当引用计数为0时,数据被释放。Arc
是线程安全的,允许在多个线程间传递数据。
RwLock
(读写锁):RwLock
允许同一时间有多个线程进行读操作,但只允许一个线程进行写操作。当有线程进行写操作时,其他读和写操作都必须等待,从而保证数据的一致性。
简单示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 使用Arc和Mutex来在线程间安全地共享数据
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
let mut num = data.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final value: {}", *shared_data.lock().unwrap());
}
在这个示例中:
- 首先创建了一个
Arc<Mutex<i32>>
类型的shared_data
,Arc
用于在多个线程间共享Mutex
包裹的i32
数据,Mutex
用于保护数据的安全访问。 - 创建10个线程,每个线程通过
Arc::clone
获取shared_data
的一份引用,然后通过lock
方法获取锁,对数据进行加1操作。lock
方法返回一个Result
,这里使用unwrap
简单处理,实际应用中应更妥善处理错误。 - 主线程等待所有子线程完成后,打印最终的数据值。