Асинхронний семафор - це структура, яка використовується в асинхронних моделях програмування. Її мета — заблокувати fire-дію, дозволяючи йому виконатися тільки після того, як група інших, асинхронних дій виконається повністю.
Асинхронний семафор — специфічний тип абстрактної структури даних семафор в світі асинхронного програмування.
Концепцію семафор винайшов голландський вчений Едсгер Дейкстра.
Структура асинхронного семафора
Асинхронний семафор приймає функцію як аргумент: Цей аргумент зазвичай називають «fire-функція». Fire-функція буде виконана після того, як всі асинхронні дії будуть завершені.
Асинхронний семафор також має блокуючу змінну: лічильник, який зберігає число невиконаних на даний момент асинхронних дій, що залишилися в черзі. Коли цей лічильник стає рівним нулю, всі асинхронні дії вже завершилися і викликається fire-функція.
Асинхронний семафор має дві додаткові функції:
- Функція v (): при виклику цієї функції, значення внутрішньої блокує змінної збільшується. Це збільшення характеризує додавання одного з асинхронних дій в чергу і очікування їм процесорного часу для виконання.
- Функція p (): коли асинхронне дія завершується, викликається функція р (). Функція p () зменшує значення внутрішньої блокує змінної. Виконане асинхронне дія завершується і видаляється з черги. Функція p () викликається зсередини завершеного асинхронного дії функції зворотного виклику. Функція p () також перевіряє рівність нулю змінної, яка характеризує кількість асинхронних дій в черзі. Якщо це так, всі дії були завершені, і fire-функція може бути викликана.
Використання асинхронного семафора
Всякий раз, коли програміст викликає одне з асинхронних дій (яке насправді буде виконане потім, коли звільниться процесорний час), програміст також викликає функцію v () асинхронного семафора з метою збільшення внутрішньої змінної блокування, яка характеризує факт додавання асинхронного дії в чергу.
Коли зворотний виклик цій асинхронної функції закінчив своє виконання, викликається функція p (), яка зменшує внутрішню змінну блокування. Це відображає той факт, що асинхронне дію завершено.
Функція p () також перевіряє, чи дорівнює нулю змінна блокування. Якщо це так, значить все асинхронні дії були завершені і «fire-функція» буде викликана.
Асинхронний семафор ефективний, коли асинхронні дії виконуються незалежно.
Примітки
Посилання