MST

星途 面试题库

面试题:Rust中条件变量如何与互斥锁配合使用

请简述在Rust中条件变量(`Condvar`)和互斥锁(`Mutex`)通常是怎样配合来实现线程间同步的,并举一个简单示例说明。
24.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

配合方式简述

  1. Mutex的作用:互斥锁用于保护共享数据,确保在同一时刻只有一个线程能够访问共享数据,防止数据竞争。
  2. Condvar的作用:条件变量用于线程间的通信。当某个条件满足时,一个线程可以通过条件变量通知其他等待该条件的线程。它不能单独使用,需要和互斥锁配合。
  3. 配合流程
    • 首先,线程获取Mutex的锁,访问共享数据。
    • 然后,线程检查共享数据的状态是否满足某个条件。如果不满足,线程调用条件变量的wait方法。在调用wait时,线程会自动释放Mutex的锁,进入等待状态。
    • 当其他线程修改共享数据使得条件满足时,该线程可以通过条件变量的notify_onenotify_all方法通知等待的线程。
    • 被通知的线程醒来后,会重新获取Mutex的锁,再次检查条件是否满足(因为可能存在虚假唤醒),如果满足则继续执行后续操作。

示例代码

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;
        cvar.notify_one();
    });

    let (lock, cvar) = &*pair;
    let mut data = lock.lock().unwrap();
    while!*data {
        data = cvar.wait(data).unwrap();
    }
    handle.join().unwrap();
    println!("Condition is met, data: {}", data);
}

在这个示例中,主线程获取锁并检查条件(*data是否为true),如果不满足则等待条件变量的通知。子线程修改共享数据(将*data设为true)并通知主线程。主线程被通知后重新获取锁并检查条件,满足条件后继续执行并打印结果。