MST

星途 面试题库

面试题:Rust中如何使用Arc和Mutex来避免并发数据竞争

请描述在Rust中,Arc和Mutex的作用分别是什么,并且编写一段代码示例,展示如何使用Arc和Mutex来安全地在多个线程间共享和访问数据,以避免并发数据竞争。
42.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Arc作用

Arc(原子引用计数)是Rust标准库提供的用于线程安全的引用计数智能指针。它允许在多个线程之间共享数据,其内部通过原子操作来管理引用计数,使得在多线程环境下,对引用计数的增减操作是线程安全的。这样可以有效地避免在多个线程间共享数据时因数据所有权问题导致的内存不安全。

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包裹的MutexMutex内部包裹了一个初始值为0的整数。
  2. 然后通过循环创建了10个线程,每个线程克隆一份Arc指针,并尝试获取Mutex的锁。
  3. 一旦某个线程获取到锁,就可以安全地修改内部数据。
  4. 最后主线程等待所有子线程完成,并打印最终的数据值。这样就实现了在多线程环境下安全地共享和修改数据。