面试题答案
一键面试use std::sync::{Arc, Mutex};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;
fn main() {
let counter = Arc::new(AtomicUsize::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
for _ in 0..1000 {
counter.fetch_add(1, Ordering::SeqCst);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final counter value: {}", counter.load(Ordering::SeqCst));
}
在上述代码中:
- 首先通过
Arc<AtomicUsize>
来创建一个可在多线程间共享的原子变量counter
,初始值为0 。Arc
是引用计数智能指针,用于在多线程环境下共享数据。 - 使用
for
循环创建10个线程,每个线程会对counter
进行1000次原子加法操作。这里使用fetch_add
方法,它以原子方式将指定的值加到当前值上,并返回旧值。Ordering::SeqCst
表示顺序一致性内存序,这是最严格的内存序,保证所有线程以相同顺序看到这些操作。 - 主线程使用
join
等待所有子线程完成。 - 最后打印出
counter
的最终值,此值通过load
方法获取,同样使用Ordering::SeqCst
内存序来确保获取到最新的值。