MST

星途 面试题库

面试题:Rust安全并发集合的基本使用

在Rust中,简要描述如何使用`std::sync::Arc`和`std::sync::Mutex`来创建一个线程安全的可修改集合,例如`Vec`。请给出具体代码示例,并解释`Arc`和`Mutex`在这个场景中的作用。
39.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

代码示例

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

fn main() {
    // 创建一个Arc<Mutex<Vec<i32>>>
    let shared_vec = Arc::new(Mutex::new(vec![1, 2, 3]));

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

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

ArcMutex的作用

  1. Arc(原子引用计数指针)
    • Arc用于在多个线程间共享数据。它通过引用计数来跟踪有多少个变量持有对数据的引用。当引用计数降为0时,数据会被自动释放。在多线程环境下,Arc使用原子操作来保证引用计数的线程安全性,这样多个线程可以安全地共享同一个数据结构的所有权。
  2. Mutex(互斥锁)
    • Mutex用于保护共享数据,确保同一时间只有一个线程可以访问和修改数据。当一个线程调用lock方法时,如果互斥锁没有被其他线程锁住,那么这个线程就会获得锁并可以访问被保护的数据。如果互斥锁已经被锁住,那么调用lock的线程会被阻塞,直到锁被释放。Mutex内部使用操作系统提供的同步原语来实现线程安全。

在上述代码中,Arc用于在多个线程间共享Mutex<Vec<i32>>,而Mutex则用于保护Vec<i32>,确保在任何时刻只有一个线程能够修改Vec