MST

星途 面试题库

面试题:Rust函数并发编程中Arc和Mutex的组合应用场景

在Rust的并发环境下,假设你有多个线程需要访问并修改同一个数据结构,为了保证线程安全,需要使用`Arc`和`Mutex`。请详细说明`Arc`和`Mutex`各自的作用以及为什么它们需要组合使用。同时,编写一段代码示例,展示多个线程如何通过`Arc<Mutex<T>>`安全地访问和修改一个`Vec<i32>`类型的数据。
43.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Arc的作用

Arc即原子引用计数(Atomic Reference Counting)指针。它允许在多个线程间共享数据。Arc通过引用计数的方式,记录有多少个Arc实例指向同一个数据。当最后一个Arc实例被销毁时,其所指向的数据也会被释放。由于引用计数的操作需要原子操作以确保在多线程环境下的正确性,所以Arc适用于多线程场景。

Mutex的作用

Mutex即互斥锁(Mutual Exclusion)。它用于保护共享数据,确保在同一时刻只有一个线程能够访问该数据。当一个线程获取了Mutex的锁,其他线程必须等待锁被释放后才能获取锁并访问数据,以此保证数据的一致性和线程安全。

组合使用的原因

Arc使得数据可以在多个线程间共享,但它本身并不提供同步机制,多个线程同时访问和修改共享数据会导致数据竞争。而Mutex提供了同步机制,保证同一时刻只有一个线程能访问数据。所以将ArcMutex组合使用,Arc负责在多线程间共享数据,Mutex负责保护共享数据,确保线程安全。

代码示例

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

fn main() {
    let shared_vec = Arc::new(Mutex::new(vec![1, 2, 3]));

    let mut handles = vec![];
    for _ in 0..3 {
        let clone = Arc::clone(&shared_vec);
        let handle = thread::spawn(move || {
            let mut vec = clone.lock().unwrap();
            vec.push(4);
            println!("{:?}", vec);
        });
        handles.push(handle);
    }

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

在上述代码中,首先创建了一个Arc<Mutex<Vec<i32>>>类型的shared_vec。然后通过Arc::clone在每个线程中创建Arc的克隆,每个线程获取Mutex的锁,修改Vec<i32>,最后打印修改后的结果。join方法等待所有线程执行完毕。