Условные переменные
Условная переменная — это способ заблокировать поток, пока не произойдёт какое-то событие. Поток может ожидать условной переменной, чтобы его разбудили, когда другой поток уведомит об этом.
Условная переменная связана с мьютексом и, концептуально, с каким-то условием. Для правильной работы мьютекс должен быть получен, а затем ожидающий поток должен циклически проверять условие и ждать условной переменной. Например:
(with-mutex mutex
(while (not global-variable)
(condition-wait cond-var)))
Мьютекс гарантирует атомарность, а цикл — надёжность: могут быть ложные уведомления.
Аналогично, мьютекс должен быть получен перед уведомлением об условии. Типичный и лучший подход заключается в получении мьютекса, внесении изменений, связанных с этим условием, а затем уведомлении о нём:
(with-mutex mutex (setq global-variable (some-computation)) (condition-notify cond-var))
- Функция: make-condition-variable mutex &optional name
Создаёт новую условную переменную, связанную с mutex. Если name задан, это имя, присваиваемое условной переменной. Оно должно быть строкой. Имя предназначено только для отладки; для Emacs оно не имеет значения.
- Функция: condition-variable-p object
Эта функция возвращает
tесли object представляет условную переменную,nilв противном случае.
- Функция: condition-wait cond
-
Ожидает, пока другой поток не уведомит cond, условную переменную. Эта функция будет блокироваться, пока условие не будет уведомлено или пока данному потоку не будет отправлен сигнал с помощью
thread-signal.Вызов
condition-waitбез держания мьютекса, связанного с условием, является ошибкой.condition-waitосвобождает связанный мьютекс во время ожидания. Это позволяет другим потокам получить мьютекс, чтобы уведомить об условии.
- Функция: condition-notify cond &optional all
-
Уведомляет cond. Мьютекс с cond должен быть получен перед вызовом этой функции. Обычно один ожидающий поток пробуждается с помощью
condition-notify; но если all неnil, тогда все потоки, ожидающие cond, уведомляются.condition-notifyосвобождает связанный мьютекс во время ожидания. Это позволяет другим потокам получить мьютекс, чтобы ожидать условия.
- Функция: condition-name cond
Возвращает имя cond, переданное в
make-condition-variable.
- Функция: condition-mutex cond
Возвращает мьютекс, связанный с cond. Обратите внимание, что связанный мьютекс изменить нельзя.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Condition-Variables.html