面试题答案
一键面试释放 - 获取顺序基本概念
在Rust的间接延迟初始化场景中,释放 - 获取顺序是一种内存同步机制。当一个线程以释放(release)操作存储一个值时,这个操作会确保在此之前的所有内存访问都已完成并对其他线程可见。而另一个线程以获取(acquire)操作读取这个值时,它会确保在此之后的所有内存访问能够看到在释放操作之前完成的所有内存访问结果。这有助于避免数据竞争,保证跨线程数据访问的一致性。
代码示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let shared_data = Arc::new(Mutex::new(None));
let shared_data_clone = shared_data.clone();
let thread1 = thread::spawn(move || {
let mut data = shared_data_clone.lock().unwrap();
*data = Some(42);
});
let shared_data_clone = shared_data.clone();
let thread2 = thread::spawn(move || {
let data = shared_data_clone.lock().unwrap();
if let Some(value) = *data {
println!("Thread 2 saw value: {}", value);
}
});
thread1.join().unwrap();
thread2.join().unwrap();
}
在上述代码中,Mutex
内部使用了释放 - 获取顺序来保证数据一致性。thread1
通过lock
获取锁(类似获取操作),修改数据后释放锁(类似释放操作)。thread2
同样通过lock
获取锁来读取数据,这样就确保了thread2
能看到thread1
写入的数据,防止了数据竞争。如果没有这种内存顺序保证,thread2
可能看不到thread1
写入的数据,从而导致数据竞争问题。