MST
星途 面试题库

面试题:Rust原子操作在复杂进度报告结构中的应用

假设进度报告的数据结构不仅包含简单的进度数值,还包含关联的任务描述、时间戳等信息组成的结构体。在多线程环境下更新该复杂进度报告结构时,如何运用Rust原子操作保证整个结构体的完整性和线程安全?请给出具体的代码示例,并解释关键部分的实现逻辑。
45.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::sync::{Arc, Mutex};
use std::thread;

// 定义包含进度、任务描述和时间戳的结构体
struct ProgressReport {
    progress: u32,
    task_description: String,
    timestamp: String,
}

fn main() {
    // 使用Arc和Mutex来实现线程安全
    let shared_report = Arc::new(Mutex::new(ProgressReport {
        progress: 0,
        task_description: "Initial task".to_string(),
        timestamp: "00:00:00".to_string(),
    }));

    let mut handles = vec![];

    for _ in 0..10 {
        let report_clone = shared_report.clone();
        let handle = thread::spawn(move || {
            // 锁定Mutex以安全访问和修改结构体
            let mut report = report_clone.lock().unwrap();
            report.progress += 1;
            report.task_description = "Updated task".to_string();
            report.timestamp = "01:00:00".to_string();
        });
        handles.push(handle);
    }

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

    // 打印最终的进度报告
    let final_report = shared_report.lock().unwrap();
    println!("Final Progress: {}", final_report.progress);
    println!("Final Task Description: {}", final_report.task_description);
    println!("Final Timestamp: {}", final_report.timestamp);
}

关键部分实现逻辑解释

  1. Arc (原子引用计数指针): Arc 用于在多个线程间共享数据,它提供原子引用计数操作,确保数据在所有引用都被释放时才会被销毁,从而保证内存安全。
  2. Mutex (互斥锁): Mutex 是一种同步原语,用于保护共享数据,确保同一时间只有一个线程可以访问数据。在Rust中,Mutex 使用 lock 方法来获取锁,这会返回一个 MutexGuard,它在作用域结束时自动释放锁,从而保证数据的完整性和线程安全。
  3. 线程安全的结构体更新: 在每个线程中,通过调用 lock 方法获取 MutexGuard,从而安全地更新 ProgressReport 结构体的各个字段。这确保了在多线程环境下,对结构体的修改不会导致数据竞争,从而保证了整个结构体的完整性和线程安全。