MST

星途 面试题库

面试题:Rust并发编程中线程间如何安全共享数据

在Rust并发编程里,线程之间共享数据时可能会出现数据竞争等问题。请描述一下常用的确保线程安全共享数据的机制,比如使用`Mutex`、`Arc`等类型,并给出一个简单示例展示如何利用它们在线程间安全地共享数据。
43.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

常用确保线程安全共享数据的机制

  1. Mutex(互斥锁)
    • Mutex用于保护数据,确保同一时间只有一个线程可以访问被它包裹的数据。当一个线程获取了Mutex的锁,其他线程必须等待锁被释放才能访问数据,以此避免数据竞争。
  2. Arc(原子引用计数)
    • Arc用于在多个线程间共享数据的所有权。它通过引用计数跟踪有多少个变量持有数据的引用,当引用计数为0时,数据被释放。Arc是线程安全的,允许在多个线程间传递数据。
  3. RwLock(读写锁)
    • RwLock允许同一时间有多个线程进行读操作,但只允许一个线程进行写操作。当有线程进行写操作时,其他读和写操作都必须等待,从而保证数据的一致性。

简单示例

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

fn main() {
    // 使用Arc和Mutex来在线程间安全地共享数据
    let shared_data = Arc::new(Mutex::new(0));
    let mut handles = vec![];

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

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

    println!("Final value: {}", *shared_data.lock().unwrap());
}

在这个示例中:

  1. 首先创建了一个Arc<Mutex<i32>>类型的shared_dataArc用于在多个线程间共享Mutex包裹的i32数据,Mutex用于保护数据的安全访问。
  2. 创建10个线程,每个线程通过Arc::clone获取shared_data的一份引用,然后通过lock方法获取锁,对数据进行加1操作。lock方法返回一个Result,这里使用unwrap简单处理,实际应用中应更妥善处理错误。
  3. 主线程等待所有子线程完成后,打印最终的数据值。