MST

星途 面试题库

面试题:Rust中条件变量用于线程同步的基本原理

请简述在Rust中使用条件变量进行线程同步时,条件变量、互斥锁以及等待线程之间是如何协作来实现线程同步的,并且给出一个简单的示例代码展示条件变量的基本用法。
40.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

条件变量、互斥锁与等待线程的协作原理

  1. 互斥锁(Mutex):用于保护共享数据,确保在同一时间只有一个线程可以访问共享数据。在Rust中,Mutex类型提供了这种机制。
  2. 条件变量(Condvar):用于线程间的同步,当某个条件满足时唤醒等待的线程。Condvar类型实现了此功能。
  3. 等待线程:当条件不满足时,线程会通过条件变量进入等待状态。在等待过程中,线程会自动释放它持有的互斥锁,允许其他线程修改共享数据。当条件变量收到通知(通过notify_onenotify_all方法),等待线程被唤醒后会重新获取互斥锁,然后检查条件是否满足。

示例代码

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

fn main() {
    let pair = Arc::new((Mutex::new(false), Condvar::new()));
    let pair2 = pair.clone();

    let handle = thread::spawn(move || {
        let (lock, cvar) = &*pair2;
        let mut data = lock.lock().unwrap();
        *data = true;
        println!("线程修改数据并通知等待线程");
        cvar.notify_one();
    });

    let (lock, cvar) = &*pair;
    let mut data = lock.lock().unwrap();
    while!*data {
        data = cvar.wait(data).unwrap();
    }
    println!("等待线程被唤醒并获取到数据");
    handle.join().unwrap();
}

在这个示例中,主线程等待某个条件(datatrue),而新线程修改数据并通知主线程。主线程在等待时会释放互斥锁,确保其他线程可以修改共享数据。一旦收到通知,主线程重新获取互斥锁并检查条件是否满足。