MST

星途 面试题库

面试题:Rust中结构体可变性与线程安全基础

在Rust中,简述如何通过`Mutex`来实现结构体可变性的线程安全控制。请举例说明,定义一个包含`i32`成员的结构体,在多线程环境下安全地修改该成员的值。
43.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 简述通过Mutex实现结构体可变性线程安全控制
    • 在Rust中,Mutex(互斥锁)用于保护共享数据,确保同一时间只有一个线程可以访问该数据。当一个线程想要访问被Mutex保护的数据时,它需要先获取锁。如果锁已被其他线程持有,该线程将被阻塞,直到锁被释放。这样就保证了在多线程环境下对共享数据的可变性操作是线程安全的。
  2. 示例代码
use std::sync::{Arc, Mutex};
use std::thread;

// 定义包含i32成员的结构体
struct MyStruct {
    value: i32,
}

fn main() {
    // 使用Arc和Mutex来创建一个线程安全的共享实例
    let shared_struct = Arc::new(Mutex::new(MyStruct { value: 0 }));

    let mut handles = vec![];

    for _ in 0..10 {
        let shared_struct_clone = shared_struct.clone();
        let handle = thread::spawn(move || {
            // 获取锁
            let mut my_struct = shared_struct_clone.lock().unwrap();
            my_struct.value += 1;
        });
        handles.push(handle);
    }

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

    // 输出最终的值
    let final_value = shared_struct.lock().unwrap().value;
    println!("Final value: {}", final_value);
}

在上述代码中:

  • 首先定义了MyStruct结构体,它包含一个i32类型的成员value
  • 使用Arc<Mutex<MyStruct>>来创建一个线程安全且可在多线程间共享的MyStruct实例。Arc(原子引用计数)用于在多线程环境下共享数据,Mutex用于保护MyStruct实例的可变性。
  • main函数中,创建10个线程,每个线程尝试获取锁并修改MyStruct实例的value成员。
  • 最后等待所有线程执行完毕,并输出value的最终值。通过Mutex的机制,确保了在多线程环境下对MyStruct实例value成员的修改是线程安全的。