MST

星途 面试题库

面试题:Rust中条件变量在同步函数调用里的复杂应用

在一个多线程Rust程序中,有一组线程需要等待某个条件满足后才能继续执行特定的同步函数操作。请使用条件变量(Condvar)结合Mutex来实现这个逻辑,并解释在实现过程中如何处理虚假唤醒等问题。
31.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::sync::{Arc, Condvar, Mutex};
use std::thread;

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

    // 等待线程
    let waiting_thread = thread::spawn(move || {
        let (lock, cvar) = &*data_clone;
        let mut data = lock.lock().unwrap();
        while!*data {
            data = cvar.wait(data).unwrap();
        }
        println!("条件满足,执行同步函数操作");
    });

    // 通知线程
    let notifying_thread = thread::spawn(move || {
        let (lock, _) = &*data;
        let mut data = lock.lock().unwrap();
        *data = true;
        drop(data);
        println!("设置条件为满足");
        (lock, _).1.notify_one();
    });

    waiting_thread.join().unwrap();
    notifying_thread.join().unwrap();
}

虚假唤醒问题处理

在上述代码中,使用while循环来检查条件是否真的满足,而不是仅仅依赖wait调用的返回。因为在某些操作系统上,Condvar::wait可能会在没有调用notify_onenotify_all的情况下返回,这就是虚假唤醒。通过while循环持续检查条件,即使发生虚假唤醒,线程也会继续等待直到条件真正满足,从而避免了误操作。