РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1081 of 1245 menu

Метод 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,
    который пробуждает все ожидающие потоки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить