MST
星途 面试题库

面试题:Rust中Mutex与Arc在多线程编程里如何协同工作

请阐述在Rust多线程编程场景下,Mutex与Arc的作用分别是什么,以及它们是怎样相互配合来确保线程安全的,可结合简单代码示例说明。
23.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Mutex的作用

Mutex(互斥锁)在Rust中用于保护共享数据,确保同一时间只有一个线程可以访问该数据。它通过提供一种机制,让线程在访问数据前获取锁,访问结束后释放锁。这样可以避免多个线程同时修改数据导致的数据竞争问题。

Arc的作用

Arc(原子引用计数)用于在多个线程间共享数据。它是引用计数智能指针,能够跟踪有多少个指针指向同一数据。Arc允许数据在多个线程间安全地共享,因为它的引用计数操作是原子的,这保证了在多线程环境下引用计数的修改不会出现数据竞争。

二者配合确保线程安全

Mutex通常与Arc一起使用,当需要在多个线程间共享可变数据时,Arc用于在多个线程间传递数据的所有权,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());
}

在上述代码中,Arc<Mutex<i32>> 类型的 shared_data 在多个线程间共享。每个线程通过 Arc::clone 获取数据的共享引用,然后使用 lock 方法获取 Mutex 的锁来修改数据。由于 Mutex 的存在,同一时间只有一个线程能修改 i32 数据,从而确保了线程安全。