Spec-Zone.ru › Elisp

Условные переменные

Условная переменная — это способ заблокировать поток, пока не произойдёт какое-то событие. Поток может ожидать условной переменной, чтобы его разбудили, когда другой поток уведомит об этом.

Условная переменная связана с мьютексом и, концептуально, с каким-то условием. Для правильной работы мьютекс должен быть получен, а затем ожидающий поток должен циклически проверять условие и ждать условной переменной. Например:

(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API