MST

星途 面试题库

面试题:Rust中如何在静态对象的并发处理场景下保证数据安全

在Rust中,当有多个线程并发访问一个静态对象时,可能会出现数据竞争问题。请描述如何利用Rust的特性,如所有权、借用、Mutex等来保证静态对象在并发处理过程中的数据安全,并给出一个简单的代码示例。
26.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

利用Rust特性保证静态对象并发数据安全

  1. 所有权与借用:Rust通过所有权系统确保同一时间只有一个所有者可以修改数据,且借用规则保证在借用期间数据不会被修改。但对于多线程并发访问静态对象,这些规则无法直接保证数据安全,因为不同线程可以同时访问静态对象。
  2. Mutex:互斥锁(Mutex)是Rust用于解决多线程数据竞争的重要工具。Mutex允许在任何时刻只有一个线程可以访问被其保护的数据。线程必须先获取锁才能访问数据,访问结束后释放锁,其他线程才能获取锁并访问数据。

代码示例

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

// 定义一个静态的Mutex包裹的对象
static SHARED_DATA: Mutex<i32> = Mutex::new(0);

fn main() {
    let mut handles = vec![];

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

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

    let result = SHARED_DATA.lock().unwrap();
    println!("Final value: {}", *result);
}

在上述代码中:

  • SHARED_DATA 是一个静态的 Mutex<i32>,使用 Mutex 来保护 i32 类型的数据。
  • main 函数中,创建了10个线程,每个线程通过 lock 方法获取 Mutex 的锁,对共享数据进行修改。
  • 最后,主线程等待所有子线程完成,并打印最终的共享数据值。这样就通过 Mutex 保证了静态对象在多线程并发访问时的数据安全。