Справочник Ada 2012
D.10.1 Синхронные барьеры
В этом подпункте представлен определяемый языком пакет для синхронного освобождения группы задач после достижения числа заблокированных задач заданного значения счётчика.
Статическая семантика
Существует определяемый языком библиотечный пакет:
package Ada.Synchronous_Barriers is
pragma Preelaborate(Synchronous_Barriers);
pragma Preelaborate(Synchronous_Barriers);
subtype Barrier_Limit is Positive range 1 .. определяется реализацией;
type Synchronous_Barrier (Release_Threshold : Barrier_Limit) is limited private;
procedure Wait_For_Release (The_Barrier : in out Synchronous_Barrier;
Notified : out Boolean);
Notified : out Boolean);
private
-- не определено языком
end Ada.Synchronous_Barriers;
-- не определено языком
end Ada.Synchronous_Barriers;
Тип Synchronous_Barrier требует финализации (см. 7.6).
Динамическая семантика
Каждый вызов Wait_For_Release блокирует вызывающую задачу до тех пор, пока количество заблокированных задач, связанных с объектом Synchronous_Barrier, не станет равным Release_Threshold, в этот момент все заблокированные задачи освобождаются. Notified устанавливается в True для одной из освобождённых задач и в False для всех остальных освобождённых задач.
Механизм определения задачи, устанавливающей Notified в True, определяется реализацией.
После освобождения всех задач объект Synchronous_Barrier может быть повторно использован для блокировки другого количества задач Release_Threshold.
В качестве первого шага финализации Synchronous_Barrier, каждая заблокированная задача разблокируется, а в месте вызова Wait_For_Release поднимается исключение Program_Error.
Определяется реализацией, прерывается ли ненормальная задача, ожидающая объекта Synchronous_Barrier, немедленно или прерывается при освобождении задач, ожидающих объекта.
Wait_For_Release — это потенциально блокирующая операция (см. 9.5.1).
Ограниченные (временно́й ошибки)
Вызов Wait_For_Release для объекта Synchronous_Barrier после его финализации является ограниченной ошибкой. Если ошибка обнаружена, генерируется Program_Error. В противном случае вызов выполняется нормально, что может привести к вечному блокированию задачи.