面试题答案
一键面试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_one
或notify_all
的情况下返回,这就是虚假唤醒。通过while
循环持续检查条件,即使发生虚假唤醒,线程也会继续等待直到条件真正满足,从而避免了误操作。