MST

星途 面试题库

面试题:Rust中原子操作的基本使用

在Rust中,如何使用原子操作来实现多线程间对共享变量的安全访问?请给出一个简单示例,展示使用`AtomicUsize`类型在多线程环境下进行计数操作。
11.2万 热度难度
编程语言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用于在多个线程间共享数据,AtomicUsize提供原子操作。
  2. 使用thread::spawn创建10个线程,每个线程对计数器进行1000次原子加法操作fetch_add,使用Ordering::SeqCst顺序一致性内存序,保证操作的原子性和顺序性。
  3. 主线程等待所有子线程完成,最后打印出计数器的最终值。