MST

星途 面试题库

面试题:Rust间接延迟初始化中释放获取顺序基础理解

在Rust间接延迟初始化场景下,解释释放获取顺序(release - acquire ordering)的基本概念,并举出一个简单代码示例说明其在防止数据竞争方面的作用。
37.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

释放 - 获取顺序基本概念

在Rust的间接延迟初始化场景中,释放 - 获取顺序是一种内存同步机制。当一个线程以释放(release)操作存储一个值时,这个操作会确保在此之前的所有内存访问都已完成并对其他线程可见。而另一个线程以获取(acquire)操作读取这个值时,它会确保在此之后的所有内存访问能够看到在释放操作之前完成的所有内存访问结果。这有助于避免数据竞争,保证跨线程数据访问的一致性。

代码示例

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let shared_data = Arc::new(Mutex::new(None));

    let shared_data_clone = shared_data.clone();
    let thread1 = thread::spawn(move || {
        let mut data = shared_data_clone.lock().unwrap();
        *data = Some(42);
    });

    let shared_data_clone = shared_data.clone();
    let thread2 = thread::spawn(move || {
        let data = shared_data_clone.lock().unwrap();
        if let Some(value) = *data {
            println!("Thread 2 saw value: {}", value);
        }
    });

    thread1.join().unwrap();
    thread2.join().unwrap();
}

在上述代码中,Mutex内部使用了释放 - 获取顺序来保证数据一致性。thread1通过lock获取锁(类似获取操作),修改数据后释放锁(类似释放操作)。thread2同样通过lock获取锁来读取数据,这样就确保了thread2能看到thread1写入的数据,防止了数据竞争。如果没有这种内存顺序保证,thread2可能看不到thread1写入的数据,从而导致数据竞争问题。