MST

星途 面试题库

面试题:Rust中原子操作基础

在Rust中,如何使用原子操作来保证多线程环境下共享变量的安全访问?请举例说明使用`AtomicUsize`类型进行简单的原子加法操作的代码实现。
30.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
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));
}

在上述代码中:

  1. 首先通过Arc<AtomicUsize>来创建一个可在多线程间共享的原子变量counter,初始值为0 。Arc是引用计数智能指针,用于在多线程环境下共享数据。
  2. 使用for循环创建10个线程,每个线程会对counter进行1000次原子加法操作。这里使用fetch_add方法,它以原子方式将指定的值加到当前值上,并返回旧值。Ordering::SeqCst表示顺序一致性内存序,这是最严格的内存序,保证所有线程以相同顺序看到这些操作。
  3. 主线程使用join等待所有子线程完成。
  4. 最后打印出counter的最终值,此值通过load方法获取,同样使用Ordering::SeqCst内存序来确保获取到最新的值。