面试题答案
一键面试设计思路
在Rust中,AtomicU64
提供了不同的Ordering
选项来控制内存同步。为了保证加载操作能看到最新的存储值,同时减少不必要的同步开销,可以在存储操作时使用Release
语义,在加载操作时使用Acquire
语义。Release
语义会确保在存储之前的所有写操作对其他线程可见,Acquire
语义会确保加载之后的所有读操作能看到最新的值。
关键代码片段
use std::sync::atomic::{AtomicU64, Ordering};
use std::thread;
fn main() {
let num = AtomicU64::new(0);
let mut handles = Vec::new();
// 存储线程
for _ in 0..3 {
let num_clone = num.clone();
let handle = thread::spawn(move || {
num_clone.store(42, Ordering::Release);
});
handles.push(handle);
}
// 加载线程
for _ in 0..3 {
let num_clone = num.clone();
let handle = thread::spawn(move || {
let value = num_clone.load(Ordering::Acquire);
println!("Loaded value: {}", value);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}