MST

星途 面试题库

面试题:Rust中如何使用Mutex处理数据竞争

在Rust中,Mutex是一种常用的处理并发数据竞争的工具。请描述Mutex的工作原理,并编写一段简单的Rust代码示例,展示如何通过Mutex在多线程环境下安全地共享数据。
13.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Mutex工作原理

Mutex(互斥锁)是一种同步原语,它的工作原理基于“互斥访问”原则。Mutex在任何时刻只允许一个线程持有锁,其他试图获取锁的线程将被阻塞,直到持有锁的线程释放锁。这确保了在同一时间只有一个线程可以访问被Mutex保护的数据,从而避免数据竞争。当一个线程成功获取锁时,它可以安全地访问和修改共享数据,完成操作后释放锁,以便其他线程有机会获取锁并访问数据。

代码示例

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

fn main() {
    // 使用Arc和Mutex来创建一个可在多线程间共享的数据
    let data = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let data_clone = Arc::clone(&data);
        let handle = thread::spawn(move || {
            let mut num = data_clone.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

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

    // 打印最终结果
    println!("Final value: {}", *data.lock().unwrap());
}

在这段代码中:

  1. Arc<Mutex<i32>> 用于创建一个可以在多线程间共享的 i32 类型数据,Arc 提供引用计数的堆分配数据,Mutex 用于保护数据。
  2. 创建10个线程,每个线程获取 Mutex 的锁(lock 方法),然后对共享数据进行修改。
  3. 主线程等待所有子线程完成(join 方法),最后打印共享数据的最终值。通过 Mutex 的保护,多个线程可以安全地修改共享数据而不会发生数据竞争。