MST

星途 面试题库

面试题:Rust原子操作存储与加载技巧之复杂场景

在多线程环境下,有多个线程同时对一个`AtomicU64`类型的变量进行操作。其中部分线程进行加载(load)操作,部分线程进行存储(store)操作。请设计一个方案,使用`Ordering`来保证加载操作能够看到最新的存储值,同时尽量减少不必要的同步开销。阐述你的设计思路,并给出关键代码片段。
27.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

设计思路

在Rust中,AtomicU64提供了不同的Ordering选项来控制内存同步。为了保证加载操作能看到最新的存储值,同时减少不必要的同步开销,可以在存储操作时使用Release语义,在加载操作时使用Acquire语义。Release语义会确保在存储之前的所有写操作对其他线程可见,Acquire语义会确保加载之后的所有读操作能看到最新的值。

关键代码片段

use std::sync::atomic::{AtomicU64, Ordering};
use std::thread;

fn main() {
    let num = AtomicU64::new(0);

    let mut handles = Vec::new();

    // 存储线程
    for _ in 0..3 {
        let num_clone = num.clone();
        let handle = thread::spawn(move || {
            num_clone.store(42, Ordering::Release);
        });
        handles.push(handle);
    }

    // 加载线程
    for _ in 0..3 {
        let num_clone = num.clone();
        let handle = thread::spawn(move || {
            let value = num_clone.load(Ordering::Acquire);
            println!("Loaded value: {}", value);
        });
        handles.push(handle);
    }

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