面试题答案
一键面试- 原子操作确保数据同步原理:
- 在Rust中,原子类型(如
std::sync::atomic::AtomicU32
等)提供了对基本数据类型的原子操作。原子操作是不可中断的操作,多个线程同时对原子类型进行操作时,不会出现数据竞争。通过使用原子类型,我们可以安全地在多线程环境下更新共享数据。
- 在Rust中,原子类型(如
- 代码示例:
use std::sync::{Arc, Mutex};
use std::sync::atomic::{AtomicU32, Ordering};
use std::thread;
fn main() {
let progress = Arc::new(AtomicU32::new(0));
let handles = (0..10).map(|_| {
let progress_clone = progress.clone();
thread::spawn(move || {
for _ in 0..100 {
progress_clone.fetch_add(1, Ordering::Relaxed);
}
})
}).collect::<Vec<_>>();
for handle in handles {
handle.join().unwrap();
}
println!("Final progress: {}", progress.load(Ordering::Relaxed));
}
在这个示例中:
- 我们使用
Arc<AtomicU32>
来在多个线程间共享AtomicU32
类型的progress
变量。Arc
(原子引用计数)用于在多个线程间安全地共享数据,而AtomicU32
确保对其进行的操作是原子的。 - 在每个线程中,使用
fetch_add
方法原子地增加progress
的值。Ordering::Relaxed
表示该操作是一个宽松的原子操作,在这种场景下满足我们的需求。 - 最后,主线程等待所有线程完成,并打印最终的进度值。