面试题答案
一键面试use std::sync::atomic::{AtomicI32, Ordering};
use std::thread;
fn main() {
let counter = AtomicI32::new(0);
let mut handles = vec![];
for _ in 0..10 {
let counter_clone = counter.clone();
let handle = thread::spawn(move || {
for _ in 0..100 {
counter_clone.fetch_add(1, Ordering::Relaxed);
counter_clone.fetch_sub(1, Ordering::Relaxed);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final counter value: {}", counter.load(Ordering::Relaxed));
}
选择宽松顺序(Relaxed
)而不是更强的顺序,原因在于宽松顺序原子操作只保证操作的原子性,不保证内存顺序。在这个计数器场景中,对计数器的增减操作并不依赖于其他线程的操作顺序,仅关心最终的计数值。使用宽松顺序可以减少内存屏障带来的开销,提升性能。而更强的顺序(如SeqCst
)会引入更多的内存屏障,确保所有线程对内存操作的顺序一致性,但在这种简单计数器场景下,这种额外的开销是不必要的。