use std::{ sync::{Arc, Condvar, Mutex}, thread, time::Duration, }; fn main() { let pair = Arc::new((Mutex::new(false), Condvar::new())); let pair_clone1 = Arc::clone(&pair); let pair_clone2 = Arc::clone(&pair); thread::spawn(move || { let (lock, cvar) = &*pair_clone1; let mut started = lock.lock().unwrap(); *started = true; std::thread::sleep(Duration::from_secs(3)); cvar.notify_all(); }); thread::spawn(move || { let (lock, cvar) = &*pair_clone2; let mut started = lock.lock().unwrap(); while !*started { println!("waiting 2"); started = cvar.wait(started).unwrap(); } println!("Thread 2 proceeding..."); }); let (lock, cvar) = &*pair; let mut started = lock.lock().unwrap(); while !*started { println!("waiting 1"); started = cvar.wait(started).unwrap(); } println!("Thread 1 proceeding..."); }