面试题答案
一键面试- 简述实现方法:
- 在Rust中,
std::sync::atomic
模块提供了原子类型和操作,用于多线程环境下的数据共享和同步。为了统计特定事件的发生次数,可以使用AtomicUsize
类型(假设事件次数用无符号整数表示)。 - 创建
AtomicUsize
变量后,在每个线程中,当特定事件发生时,使用原子操作(如fetch_add
)来安全地增加这个变量的值,而无需额外的锁机制(因为原子操作本身是线程安全的)。
- 在Rust中,
- 代码示例:
use std::sync::Arc;
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_clone = Arc::clone(&counter);
let handle = thread::spawn(move || {
// 在每个线程中对原子变量进行操作
for _ in 0..100 {
counter_clone.fetch_add(1, Ordering::SeqCst);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 获取最终的统计结果
let result = counter.load(Ordering::SeqCst);
println!("事件发生次数: {}", result);
}
在上述代码中:
- 首先通过
Arc<AtomicUsize>
创建了一个可在多线程间共享的原子变量counter
,初始值为0。 - 然后创建了10个线程,每个线程模拟事件发生100次,通过
fetch_add
原子操作增加counter
的值。 - 最后主线程等待所有线程完成,并获取最终的统计结果并打印。