MST

星途 面试题库

面试题:Rust原子操作在统计功能中的基础应用

在Rust中,假设要统计一个多线程环境下某个特定事件的发生次数。请简述如何使用原子操作来实现这一统计功能,并且给出简单的代码示例,包括如何创建原子变量以及在多线程中对其进行操作。
10.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 简述实现方法
    • 在Rust中,std::sync::atomic模块提供了原子类型和操作,用于多线程环境下的数据共享和同步。为了统计特定事件的发生次数,可以使用AtomicUsize类型(假设事件次数用无符号整数表示)。
    • 创建AtomicUsize变量后,在每个线程中,当特定事件发生时,使用原子操作(如fetch_add)来安全地增加这个变量的值,而无需额外的锁机制(因为原子操作本身是线程安全的)。
  2. 代码示例
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的值。
  • 最后主线程等待所有线程完成,并获取最终的统计结果并打印。