MST

星途 面试题库

面试题:Rust 中实现线程安全,Arc 和 Mutex 如何配合使用

请阐述在 Rust 中 Arc(原子引用计数)和 Mutex(互斥锁)的工作原理,并举例说明如何通过它们配合来实现一个线程安全的计数器,要求写出具体代码实现。
41.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Arc(原子引用计数)工作原理

Arc 是 Atomic Reference Counting 的缩写,用于在多个线程间共享数据。它通过内部维护一个引用计数,当有新的引用指向该数据时,引用计数加一;当引用离开作用域,引用计数减一。当引用计数降为 0 时,数据被自动释放。Arc 之所以能用于多线程,是因为其引用计数的操作是原子的,避免了竞态条件。

Mutex(互斥锁)工作原理

Mutex 即 Mutual Exclusion,是一种同步原语。它通过锁机制来保证在同一时刻只有一个线程能够访问被保护的数据。当一个线程获取到锁时,其他线程必须等待,直到该线程释放锁。这样可以防止多个线程同时修改数据,从而保证数据的一致性。

代码实现线程安全的计数器

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

fn main() {
    // 创建一个 Arc 包裹的 Mutex,内部包含计数器
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        // 克隆 Arc
        let counter_clone = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            // 获取 Mutex 的锁
            let mut num = counter_clone.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

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

    // 打印最终的计数值
    println!("Final counter value: {}", *counter.lock().unwrap());
}

在这段代码中:

  1. 首先创建了一个 Arc<Mutex<i32>> 类型的 counterArc 用于线程间共享 MutexMutex 保护内部的 i32 计数器。
  2. 通过循环创建 10 个线程,每个线程克隆 Arc,并获取 Mutex 的锁来安全地增加计数器的值。
  3. 主线程等待所有子线程完成后,获取 Mutex 的锁并打印最终的计数值。