面试题答案
一键面试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
用于在多个线程间共享数据,AtomicUsize
提供原子操作。 - 使用
thread::spawn
创建10个线程,每个线程对计数器进行1000次原子加法操作fetch_add
,使用Ordering::SeqCst
顺序一致性内存序,保证操作的原子性和顺序性。 - 主线程等待所有子线程完成,最后打印出计数器的最终值。