MST

星途 面试题库

面试题:Rust宽松顺序在简单并发场景中的应用

假设你正在开发一个简单的并发程序,有多个线程需要读写共享数据。请使用Rust的宽松顺序原子操作来实现一个计数器,使得多个线程能够安全地对其进行增减操作,同时说明为什么选择宽松顺序而不是更强的顺序。
11.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::sync::atomic::{AtomicI32, Ordering};
use std::thread;

fn main() {
    let counter = AtomicI32::new(0);
    let mut handles = vec![];

    for _ in 0..10 {
        let counter_clone = counter.clone();
        let handle = thread::spawn(move || {
            for _ in 0..100 {
                counter_clone.fetch_add(1, Ordering::Relaxed);
                counter_clone.fetch_sub(1, Ordering::Relaxed);
            }
        });
        handles.push(handle);
    }

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

    println!("Final counter value: {}", counter.load(Ordering::Relaxed));
}

选择宽松顺序(Relaxed)而不是更强的顺序,原因在于宽松顺序原子操作只保证操作的原子性,不保证内存顺序。在这个计数器场景中,对计数器的增减操作并不依赖于其他线程的操作顺序,仅关心最终的计数值。使用宽松顺序可以减少内存屏障带来的开销,提升性能。而更强的顺序(如SeqCst)会引入更多的内存屏障,确保所有线程对内存操作的顺序一致性,但在这种简单计数器场景下,这种额外的开销是不必要的。