MST

星途 面试题库

面试题:Rust中Arc和Mutex实现共享可变性的基础应用

请用Rust代码示例展示如何使用Arc和Mutex来实现多个线程共享并可修改一个数据结构,假设数据结构是一个简单的整数变量。同时解释为什么这里需要使用Arc和Mutex,以及它们各自的作用。
23.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Rust代码示例

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());
}

为什么需要Arc和Mutex以及它们的作用

  1. Arc (Atomically Reference - Counted):
    • 作用:Arc 用于在多个线程间共享数据。它通过引用计数的方式来管理数据的生命周期,当最后一个引用被销毁时,数据才会被释放。在多线程环境中,Arc 保证了引用计数操作的原子性,使得多个线程可以安全地共享数据。
    • 在本示例中的必要性:如果不使用 Arc,就无法将数据结构安全地传递给多个线程,因为 Rust 的所有权系统默认情况下不允许在多个线程间共享可变数据。Arc 使得数据可以被多个线程持有相同的引用,从而实现数据共享。
  2. Mutex (Mutual Exclusion):
    • 作用:Mutex 提供了一种机制,确保在任何时刻只有一个线程可以访问其内部的数据。它通过锁(lock)来实现互斥访问,当一个线程获取了锁,其他线程就必须等待锁被释放才能访问数据。
    • 在本示例中的必要性:如果没有 Mutex,多个线程同时修改整数变量会导致数据竞争(data race),这是一种未定义行为。Mutex 保证了同一时间只有一个线程能够修改共享的整数变量,从而避免数据竞争问题。