MST
星途 面试题库

面试题:Rust原子操作在多核处理器下的基本应用

在Rust中,如何使用原子操作在多核处理器环境下实现一个简单的计数器,并且确保在多线程并发访问时数据的一致性?请给出代码示例并简要解释原子操作的原理。
26.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 代码示例
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_clone = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            for _ in 0..1000 {
                counter_clone.fetch_add(1, Ordering::SeqCst);
            }
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Final counter value: {}", counter.load(Ordering::SeqCst));
}
  1. 原子操作原理
    • 原子性:原子操作是不可分割的操作,在执行过程中不会被其他线程打断。在多核处理器环境下,这保证了多个线程对共享数据的操作不会相互干扰。例如在上述代码中,fetch_add操作是原子的,一个线程执行fetch_add时,其他线程不会看到部分完成的操作。
    • 内存顺序:通过Ordering枚举来指定内存顺序。Ordering::SeqCst(顺序一致性)是最严格的内存顺序,它保证所有线程都以相同的顺序看到所有原子操作。这确保了多线程并发访问共享数据时的一致性。不同的Ordering选项适用于不同的性能和同步需求场景,例如Relaxed是最宽松的顺序,仅保证原子性,但不保证操作的顺序一致性。