Метод notify_all
Метод notify_all пробуждает все потоки, которые в данный момент ожидают на условной переменной Condvar. Параметров метод не принимает. Он не возвращает значение. Обычно метод используется вместе с мьютексом и условной переменной для реализации шаблона синхронизации, при котором несколько потоков ожидают изменения общего состояния.
Синтаксис
condvar.notify_all()
Пример
Давайте рассмотрим пример, в котором главный поток изменяет общее значение и пробуждает все ожидающие потоки с помощью метода notify_all:
use std::sync::{Arc, Condvar, Mutex};
use std::thread;
fn main()
{
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let mut handles = vec![];
for _ in 0..3 {
let pair = Arc::clone(&pair);
let handle = thread::spawn(move || {
let (lock, cvar) = &*pair;
let mut started = lock.lock().unwrap();
while !*started {
started = cvar.wait(started).unwrap();
}
println!("Thread is running");
});
handles.push(handle);
}
let (lock, cvar) = &*pair;
let mut started = lock.lock().unwrap();
*started = true;
cvar.notify_all();
drop(started);
for handle in handles {
handle.join().unwrap();
}
}
Результат выполнения кода:
Thread is running
Thread is running
Thread is running
Пример
Давайте рассмотрим пример, в котором метод notify_all вызывается до того, как потоки начали ожидание. В этом случае пробуждения не произойдёт, и потоки останутся заблокированными:
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 pair_clone = Arc::clone(&pair);
let handle = thread::spawn(move || {
let (lock, cvar) = &*pair_clone;
let mut started = lock.lock().unwrap();
while !*started {
started = cvar.wait(started).unwrap();
}
println!("Thread is running");
});
let (lock, cvar) = &*pair;
let mut started = lock.lock().unwrap();
*started = true;
cvar.notify_all();
drop(started);
thread::sleep(Duration::from_millis(100));
handle.join().unwrap();
}
Результат выполнения кода:
Thread is running
Смотрите также
-
класс
Condvar,
который представляет условную переменную для синхронизации потоков -
метод
wait,
который блокирует текущий поток до получения уведомления -
метод
wait_timeout,
который блокирует поток на указанное время или до уведомления -
метод
notify_one,
который пробуждает только один ожидающий поток