MST

星途 面试题库

面试题:Rust宽松顺序下如何实现线程安全的共享数据访问

在Rust中,假设你需要在多个线程间以宽松顺序访问共享数据,并且要保证线程安全。请描述你会使用哪些工具(如Arc、Mutex等),并给出一个简单的代码示例来实现这个场景。
35.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,可以使用Arc(原子引用计数)来实现数据的共享,结合Mutex(互斥锁)来保证线程安全,std::sync::atomic::AtomicUsize来实现宽松顺序的原子操作。以下是示例代码:

use std::sync::{Arc, Mutex};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;

fn main() {
    let shared_data = Arc::new(Mutex::new(AtomicUsize::new(0)));
    let mut handles = vec![];

    for _ in 0..10 {
        let data = Arc::clone(&shared_data);
        let handle = thread::spawn(move || {
            let mut lock = data.lock().unwrap();
            lock.fetch_add(1, Ordering::Relaxed);
        });
        handles.push(handle);
    }

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

    let result = Arc::try_unwrap(shared_data)
        .ok()
        .unwrap()
        .into_inner()
        .load(Ordering::Relaxed);
    println!("Final result: {}", result);
}

在这个示例中:

  1. Arc<Mutex<AtomicUsize>>用于在多个线程间共享一个原子整数,并保证线程安全。
  2. Arc允许数据在多个线程间共享所有权。
  3. Mutex确保同一时间只有一个线程可以访问共享数据。
  4. AtomicUsize提供了原子操作,fetch_add方法使用Ordering::Relaxed顺序,满足宽松顺序访问的要求。
  5. 最后通过try_unwrapload方法获取最终的结果。