MST

星途 面试题库

面试题:Rust智能指针Arc与Mutex的组合应用

Arc(原子引用计数)和Mutex(互斥锁)是Rust中用于多线程场景下的智能指针类型。请描述Arc和Mutex各自的作用以及它们如何协同工作来保证多线程安全。编写一段多线程的Rust代码,使用Arc和Mutex来实现多个线程安全地访问和修改共享数据。
13.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Arc(原子引用计数)的作用

Arc 是 std::sync::Arc,它用于在多线程环境下共享数据。Arc 通过原子引用计数,允许多个线程拥有对同一数据的不可变引用。当最后一个引用被销毁时,数据会被释放。它主要解决了多线程间数据共享的问题,因为普通的 Rc(引用计数)只能用于单线程环境,而 Arc 是线程安全的引用计数智能指针。

Mutex(互斥锁)的作用

Mutex 是 std::sync::Mutex,它用于控制对共享数据的访问。Mutex 提供了一种机制,使得在任何时刻只有一个线程可以访问被它保护的数据。线程必须先获取锁才能访问数据,访问结束后释放锁,这样就避免了数据竞争问题。

协同工作原理

Arc 用于在多线程间共享数据,而 Mutex 用于保护共享数据的访问。将数据包裹在 Mutex 中,再将这个 Mutex 用 Arc 进行共享,这样不同线程可以通过 Arc 获取到 Mutex 的引用,然后尝试获取 Mutex 的锁来安全地访问和修改共享数据。

代码示例

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

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

    for _ in 0..10 {
        let data = Arc::clone(&shared_data);
        let handle = thread::spawn(move || {
            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::new(Mutex::new(0)) 创建了一个由 Arc 包裹的 Mutex,内部包含初始值为 0 的共享数据。
  2. 通过循环创建 10 个线程,每个线程克隆一份 Arc 并尝试获取 Mutex 的锁,获取成功后修改共享数据。
  3. 主线程等待所有子线程完成后,打印最终的共享数据值。这样就实现了多线程安全地访问和修改共享数据。