MST

星途 面试题库

面试题:Rust中原子操作比较和交换机制的基础应用

在Rust中,使用原子类型`AtomicUsize`,编写一个函数,利用比较和交换(CAS)机制实现一个简单的计数器,每次调用函数时,如果计数器的值小于10,就将其加1并返回更新后的值;否则返回当前值。请详细说明函数的实现思路以及`compare_and_swap`方法的参数意义。
48.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::sync::atomic::{AtomicUsize, Ordering};

fn increment_counter(counter: &AtomicUsize) -> usize {
    loop {
        let current = counter.load(Ordering::Relaxed);
        if current >= 10 {
            return current;
        }
        let new = current + 1;
        match counter.compare_and_swap(current, new, Ordering::Relaxed) {
            // compare_and_swap的第一个参数是期望的当前值
            // 第二个参数是想要设置的新值
            // 第三个参数是内存顺序,这里Relaxed表示对内存顺序要求最低,
            // 仅保证原子操作本身的原子性,不保证内存可见性等其他顺序相关的约束
            prev if prev == current => return new,
            _ => continue,
        }
    }
}

实现思路

  1. 循环尝试:使用loop无限循环,因为CAS操作可能会失败,需要不断尝试。
  2. 加载当前值:通过counter.load(Ordering::Relaxed)获取当前计数器的值。
  3. 检查条件:如果当前值大于等于10,直接返回当前值。
  4. 计算新值:如果当前值小于10,计算新值new为当前值加1。
  5. 执行CAS操作:使用compare_and_swap方法尝试将计数器的值从current更新为new。如果更新成功(即返回值prev等于current),则返回新值new;如果失败(即返回值prev不等于current),则继续循环尝试。