Метод wait_timeout
Метод wait_timeout класса Condvar ожидает уведомления от условной переменной, но не дольше, чем указанный промежуток времени. Он возвращает объект WaitTimeoutResult, который позволяет определить, было ли получено уведомление или истёк таймаут. Параметрами метод принимает мьютекс-гард, связанный с условной переменной, и значение типа Duration, задающее максимальное время ожидания.
Синтаксис
condvar.wait_timeout(guard, timeout)
Пример
Давайте рассмотрим пример, в котором поток ожидает уведомления с таймаутом в 100 миллисекунд, но уведомление не приходит:
use std::sync::{Arc, Condvar, Mutex};
use std::thread;
use std::time::Duration;
fn main()
{
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = Arc::clone(&pair);
thread::spawn(move || {
let (lock, cvar) = &*pair2;
let mut started = lock.lock().unwrap();
*started = true;
cvar.notify_one();
});
let (lock, cvar) = &*pair;
let mut started = lock.lock().unwrap();
while !*started {
let (new_started, timeout_result) = cvar
.wait_timeout(started, Duration::from_millis(100))
.unwrap();
started = new_started;
if timeout_result.timed_out() {
println!("timed out");
break;
}
}
println!("{}", *started);
}
Результат выполнения кода:
true
Пример
Давайте рассмотрим пример, в котором уведомление не приходит, и поток завершает ожидание по таймауту в 50 миллисекунд:
use std::sync::{Arc, Condvar, Mutex};
use std::time::Duration;
fn main()
{
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let (lock, cvar) = &*pair;
let started = lock.lock().unwrap();
let (_started, timeout_result) = cvar
.wait_timeout(started, Duration::from_millis(50))
.unwrap();
if timeout_result.timed_out() {
println!("timed out");
} else {
println!("notified");
}
}
Результат выполнения кода:
"timed out"
Смотрите также
-
класс
Condvar,
который представляет условную переменную для синхронизации потоков -
метод
wait,
который блокирует поток до получения уведомления -
метод
notify_one,
который пробуждает один ожидающий поток -
метод
notify_all,
который пробуждает все ожидающие потоки