Асинхронный семафор

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Асинхронный семафор — это структура, которая используется в асинхронных моделях программирования. Её цель — заблокировать fire-действие, позволяя ему выполниться только после того, как группа других асинхронных действий выполнится полностью.

Асинхронный семафор — специфический тип абстрактной структуры данных семафор в мире асинхронного программирования.

Концепцию семафоров изобрел голландский учёный Эдсгер Дейкстра.

Структура асинхронного семафора[править]

Асинхронный семафор принимает функцию как аргумент: Этот аргумент обычно называют «fire-функция». Fire-функция будет выполнена после того, как все асинхронные действия будут завершены.

Асинхронный семафор также имеет блокирующую переменную: счетчик, который хранит число невыполненных на данный момент асинхронных действий, оставшихся в очереди. Когда этот счетчик становится равным нулю, все асинхронные действия уже завершились и вызывается fire-функция.

Асинхронный семафор имеет две дополнительные функции:

Функция v(): при вызове этой функции, значение внутренней блокирующей переменной увеличивается. Это увеличение характеризует добавление одного из асинхронных действий в очередь и ожидание им процессорного времени для выполнения.

Функция p() : когда асинхронное действие завершается, вызывается функция р(). Функция p() уменьшает значение внутренней блокирующей переменной. Выполненное асинхронное действие завершается и удаляется из очереди. Функция p() вызывается изнутри завершенного асинхронного действия функции обратного вызова. Функция p() также проверяет равенство нулю переменной, которая характеризует количество асинхронных действий в очереди. Если это так, все действия были завершены, и fire-функция может быть вызвана.

Использование асинхронного семафора[править]

Всякий раз, когда программист вызывает одно из асинхронных действий (которое на самом деле будет выполнено потом, когда освободится процессорное время), программист также вызывает функцию v() асинхронного семафора в целях увеличения внутренней переменной блокировки, которая характеризует факт добавления асинхронного действия в очередь.

Когда обратный вызов этой асинхронной функции закончил своё выполнение, вызывается функция p(), которая уменьшает внутреннюю переменную блокировки. Это отражает тот факт, что асинхронное действие завершено.

Функция p() также проверяет, равна ли нулю переменная блокировки. Если это так, значит все асинхронные действия были завершены и «fire-функция» будет вызвана.

Асинхронный семафор эффективен, когда асинхронные действия выполняются независимо.

Ссылки[править]