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

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