MST

星途 面试题库

面试题:Rust中并发编程的线程同步机制

在Rust的并发编程中,常用的线程同步机制有哪些?请举例说明如何使用 `Mutex` 和 `Arc` 结合来实现线程安全的数据共享。
28.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust的并发编程中,常用的线程同步机制有:

  • Mutex(互斥锁):用于保护共享数据,同一时间只有一个线程可以获取锁来访问数据,防止数据竞争。
  • RwLock(读写锁):允许多个线程同时读数据,但只允许一个线程写数据。适用于读多写少的场景。
  • Condvar(条件变量):用于线程间的条件同步,一个线程等待某个条件满足,其他线程可以通知条件变量,唤醒等待的线程。
  • Channel(通道):用于线程间传递数据,实现生产者 - 消费者模型。

以下是使用 MutexArc 结合来实现线程安全的数据共享的示例:

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

fn main() {
    // 创建一个Arc<Mutex<i32>>类型的共享数据
    let data = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        // 克隆Arc
        let data_clone = Arc::clone(&data);
        let handle = thread::spawn(move || {
            // 尝试获取锁
            let mut num = data_clone.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

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

    // 打印最终结果
    println!("Final value: {}", *data.lock().unwrap());
}

在上述代码中:

  1. 使用 Arc 来实现数据的共享所有权,使得多个线程可以持有对同一数据的引用。
  2. 使用 Mutex 来保护共享数据 i32,确保同一时间只有一个线程能够修改它。
  3. 通过 Arc::clone 克隆 Arc,以便每个线程都能持有数据的引用。
  4. 每个线程通过 lock 方法获取 MutexGuard 来访问和修改数据,unwrap 用于处理获取锁失败的情况(实际应用中可能需要更优雅的错误处理)。
  5. 主线程等待所有子线程完成后,打印最终的共享数据值。