MST

星途 面试题库

面试题:Rust中释放和获取顺序在简单锁场景下的应用

假设你正在编写一个多线程Rust程序,使用`Mutex`来保护共享数据。请解释在这种情况下,释放和获取顺序是如何工作的,并给出一个简单示例代码展示正确的使用方式。
12.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

释放和获取顺序工作原理

在使用Mutex保护共享数据的多线程Rust程序中:

  1. 获取锁:线程通过调用lock方法获取Mutex的锁。如果锁当前可用,线程将获得锁并可以访问被保护的数据;如果锁已被其他线程持有,当前线程将被阻塞,直到锁被释放。
  2. 释放锁:当线程完成对共享数据的操作后,需要释放锁。这是通过MutexGuard结构体自动完成的。MutexGuardlock方法返回的类型,当MutexGuard离开其作用域(例如函数结束或块结束)时,MutexGuard的析构函数会自动调用,从而释放锁,允许其他等待的线程获取锁。

示例代码

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

fn main() {
    // 创建一个Arc<Mutex<T>>来在多线程间共享数据
    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;
            println!("Thread incremented data to: {}", num);
            // 当num离开作用域时,锁自动释放
        });
        handles.push(handle);
    }

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

    // 主线程获取锁并打印最终结果
    let final_result = data.lock().unwrap();
    println!("Final result: {}", final_result);
}

在这个示例中,多个线程尝试获取Mutex锁来修改共享数据dataMutexGuard确保每个线程在操作完数据后正确释放锁,保证数据的一致性和线程安全。