Функция 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,
который пробуждает один ожидающий поток