MST
星途 面试题库

面试题:Rust中Arc与Mutex如何配合实现线程同步

请描述在Rust中,Arc(原子引用计数)和Mutex(互斥锁)的工作原理,并且通过代码示例展示如何使用它们配合来实现多线程环境下的数据共享与同步。
42.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

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

Arc 是 Rust 标准库提供的原子引用计数智能指针。它通过内部维护一个引用计数,当引用该指针的地方增多或减少时,引用计数相应地增加或减少。当引用计数降为 0 时,Arc 指向的资源会被自动释放。Arc 能够在多线程环境下安全地共享数据,因为其引用计数的操作是原子的,避免了数据竞争。

Mutex(互斥锁)工作原理

Mutex(互斥锁)用于控制对共享资源的访问。它只有一个锁,线程在访问共享资源前必须先获取锁,访问完成后释放锁。如果一个线程已经获取了锁,其他线程尝试获取锁时会被阻塞,直到锁被释放,以此保证同一时间只有一个线程能访问共享资源,从而避免数据竞争。

代码示例

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

fn main() {
    // 创建一个 Arc 包裹的 Mutex,内部包裹一个 i32 类型的数据
    let shared_data = Arc::new(Mutex::new(0));

    let mut handles = vec![];
    for _ in 0..10 {
        // 克隆 Arc,以便每个线程都有自己的引用
        let data = Arc::clone(&shared_data);
        let handle = thread::spawn(move || {
            // 获取 Mutex 的锁
            let mut num = data.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

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

    // 打印最终结果
    println!("Final value: {}", *shared_data.lock().unwrap());
}

在上述代码中:

  1. 首先创建了一个 Arc<Mutex<i32>> 类型的 shared_data,这使得数据可以在多线程间安全共享,并且通过 Mutex 来控制对内部 i32 数据的访问。
  2. 然后通过循环创建 10 个线程,每个线程克隆 Arc 并尝试获取 Mutex 的锁,对内部数据进行加 1 操作。
  3. 主线程等待所有子线程执行完毕后,获取锁并打印最终的数据值。