MST

星途 面试题库

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

在Rust的并发编程场景下,简述原子类型`AtomicUsize`的常用方法,并举例说明如何使用`AtomicUsize`来实现一个简单的计数器,确保在多线程环境下计数的正确性。
34.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

AtomicUsize常用方法

  1. load方法:从原子变量中读取值。
    use std::sync::atomic::{AtomicUsize, Ordering};
    let atomic_num = AtomicUsize::new(5);
    let value = atomic_num.load(Ordering::SeqCst);
    println!("Loaded value: {}", value);
    
  2. store方法:将值存储到原子变量中。
    use std::sync::atomic::{AtomicUsize, Ordering};
    let atomic_num = AtomicUsize::new(0);
    atomic_num.store(10, Ordering::SeqCst);
    
  3. fetch_add方法:原子地增加给定的值,并返回旧值。
    use std::sync::atomic::{AtomicUsize, Ordering};
    let atomic_num = AtomicUsize::new(5);
    let old_value = atomic_num.fetch_add(3, Ordering::SeqCst);
    println!("Old value: {}, new value: {}", old_value, atomic_num.load(Ordering::SeqCst));
    
  4. fetch_sub方法:原子地减少给定的值,并返回旧值。
    use std::sync::atomic::{AtomicUsize, Ordering};
    let atomic_num = AtomicUsize::new(8);
    let old_value = atomic_num.fetch_sub(2, Ordering::SeqCst);
    println!("Old value: {}, new value: {}", old_value, atomic_num.load(Ordering::SeqCst));
    

使用AtomicUsize实现多线程计数器

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

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

    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            for _ in 0..1000 {
                counter.fetch_add(1, Ordering::SeqCst);
            }
        });
        handles.push(handle);
    }

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

    println!("Final counter value: {}", counter.load(Ordering::SeqCst));
}

在上述代码中,Arc用于在多个线程间共享AtomicUsize实例。每个线程通过fetch_add方法对计数器进行原子增加操作,确保在多线程环境下计数的正确性。