MST
星途 面试题库

面试题:Rust中释放和获取顺序同步机制的基础应用

在Rust中,描述一下如何使用`std::sync::atomic::AtomicUsize`来实现简单的释放和获取顺序同步。请给出示例代码,并且解释为什么这种方式能保证相应的同步顺序。
43.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 示例代码
use std::sync::atomic::{AtomicUsize, Ordering};

fn main() {
    let data = AtomicUsize::new(0);
    let flag = AtomicUsize::new(0);

    let data_copy = data.load(Ordering::Relaxed);
    flag.store(1, Ordering::Release);

    while flag.load(Ordering::Acquire) == 0 {
        std::thread::yield_now();
    }

    let new_data = data.load(Ordering::Relaxed);
    assert!(new_data >= data_copy);
}
  1. 同步顺序保证解释
    • 释放(Release)顺序flag.store(1, Ordering::Release); 这行代码使用 Ordering::Release 顺序存储值。当一个线程以 Release 顺序存储一个值时,它保证在此之前对内存的所有写入(这里是 data 的读取操作 let data_copy = data.load(Ordering::Relaxed);)对其他以 Acquire 顺序读取该值的线程是可见的。
    • 获取(Acquire)顺序while flag.load(Ordering::Acquire) == 0 { 这行代码使用 Ordering::Acquire 顺序加载值。当一个线程以 Acquire 顺序加载一个值时,它保证在此之后对内存的所有读取(这里是 data 的读取操作 let new_data = data.load(Ordering::Relaxed);)能看到在释放线程中 Release 顺序存储之前的所有写入操作。所以在 Acquire 加载 flag 之后读取 data,能保证看到 dataRelease 存储 flag 之前的状态,从而实现了简单的释放和获取顺序同步。