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

Функция new класса Condvar

Функция new класса Condvar создает новую условную переменную (condition variable). Условные переменные используются для ожидания наступления определенного события в одном потоке и уведомления об этом событии из другого потока. Функция не принимает параметров и возвращает новый экземпляр Condvar.

Синтаксис

Condvar::new()

Пример

Давайте создадим условную переменную и выведем факт ее успешного создания:

use std::sync::Condvar; fn main() { let condvar = Condvar::new(); println!("Condvar created"); }

Результат выполнения кода:

"Condvar created"

Пример

Давайте создадим условную переменную в паре с мьютексом и дождемся уведомления из другого потока:

use std::sync::{Arc, Condvar, Mutex}; use std::thread; fn main() { let pair = Arc::new((Mutex::new(false), Condvar::new())); let pair2 = Arc::clone(&pair); thread::spawn(move || { let (lock, condvar) = &*pair2; let mut started = lock.lock().unwrap(); *started = true; condvar.notify_one(); }); let (lock, condvar) = &*pair; let mut started = lock.lock().unwrap(); while !*started { started = condvar.wait(started).unwrap(); } println!("Notification received"); }

Результат выполнения кода:

"Notification received"

Пример

Давайте создадим условную переменную и проверим, что она корректно используется совместно с методом notify_all для пробуждения нескольких потоков:

use std::sync::{Arc, Condvar, Mutex}; use std::thread; fn main() { let pair = Arc::new((Mutex::new(0), Condvar::new())); let mut handles = vec![]; for _ in 0..3 { let pair = Arc::clone(&pair); handles.push(thread::spawn(move || { let (lock, condvar) = &*pair; let mut count = lock.lock().unwrap(); while *count == 0 { count = condvar.wait(count).unwrap(); } *count })); } let (lock, condvar) = &*pair; let mut count = lock.lock().unwrap(); *count = 1; condvar.notify_all(); for handle in handles { println!("{}", handle.join().unwrap()); } }

Результат выполнения кода:

1 1 1

Смотрите также

  • класс Condvar,
    который представляет условную переменную
  • метод wait,
    который блокирует текущий поток до получения уведомления
  • метод wait_timeout,
    который ожидает уведомление с ограничением по времени
  • метод notify_one,
    который пробуждает один ожидающий поток
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить