Ада-95. Компилятор GNAT


Инструкция перенаправления очереди requeue - часть 2


Таким образом, могут быть обработаны запросы от других клиентов или выполнена какая-либо другая обработка.

Инструкция перенаправления requeue

позволяет разделить обработку оригинального запроса/вызова на два (и более) этапа.

Чтобы продемонстрировать логику работы и использования этой инструкции, рассмотрим пример широковещательного сигнала (или события).

Задачи приостанавливаются для ожидания некоторого события, а после того как оно происходит, все приостановленные задачи продолжают свое выполнение, а событие очищается.

Сложность состоит в том, как предотвратить от попадания в ожидание задачи которые вызвали операцию ожидания после того как событие произошло, но до того как событие очищено.

Другими словами, мы должны очистить событие только после того как новые задачи продолжат свое выполнение.

Нам позволяет запрограммировать такое предпочтительное управление инструкция перенаправления requeue:

protected Event is

entry Wait; entry Signal;

private

entry Reset; Occurred: Boolean := False;

end Event;

protected body Event is

entry Wait when Occurred is

begin

null; -- пустое тело! end Wait;

entry Signal when True is -- барьер всегда True begin

if Wait'Count > 0 then

Occurred := True; requeue Reset; end if; end Signal;

entry Reset when Wait'Count = 0 is

begin

Occurred := False; end Reset;

end Event;

Задачи указывают на то, что они желают ждать событие, выполняя вызов:

Event.Wait;

а возникновение события индицируется тем, что какая-либо задача выполняет вызов:

Event.Signal;

после чего, все приостановленные в ожидании события задачи продолжат свое выполнение и событие очистится.

Таким образом, последующие вызовы входа Wait работают корректно.

Логическая переменная Occurred обычно имеет значение False.

Она имеет значение True только тогда, когда задачи возобновляют свое выполнение после приостановки в ожидании события.

Вход Wait существует, но фактически не имеет тела.

Таким образом, вызывающие задачи приостанавливают свое выполнение в его очереди, ожидая того, что переменная Occurred




- Начало -  - Назад -  - Вперед -



Книжный магазин