MST

星途 面试题库

面试题:Rust中原子操作在多线程编程中的基础应用

在Rust多线程编程场景下,假设我们有多个线程需要对一个共享变量进行递增操作,简述如何使用原子操作来保证数据的一致性和线程安全,并给出简单代码示例。
34.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 使用原子操作保证数据一致性和线程安全的简述
    • 在Rust中,std::sync::atomic模块提供了原子类型和操作,用于在多线程环境下对共享变量进行无锁的原子操作。
    • 对于简单的整数类型的递增操作,可以使用AtomicUsize(无符号整数)或AtomicI32(有符号32位整数)等原子类型。这些类型提供了fetch_add等方法,该方法会原子性地将指定的值加到当前值上,并返回旧值。通过使用这些原子类型和方法,不同线程对共享变量的递增操作不会相互干扰,从而保证数据的一致性和线程安全。
  2. 代码示例
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;

fn main() {
    let shared_variable = AtomicUsize::new(0);
    let mut handles = vec![];
    for _ in 0..10 {
        let shared_variable_clone = shared_variable.clone();
        let handle = thread::spawn(move || {
            for _ in 0..1000 {
                shared_variable_clone.fetch_add(1, Ordering::SeqCst);
            }
        });
        handles.push(handle);
    }
    for handle in handles {
        handle.join().unwrap();
    }
    println!("Final value: {}", shared_variable.load(Ordering::SeqCst));
}

在上述代码中:

  • 首先创建了一个AtomicUsize类型的共享变量shared_variable,初始值为0。
  • 然后启动10个线程,每个线程对shared_variable进行1000次原子递增操作。
  • 最后等待所有线程执行完毕,并打印出共享变量的最终值。这里使用Ordering::SeqCst表示顺序一致性内存序,这是一种比较严格的内存序,能保证所有线程看到的操作顺序一致。