Справочник Ada (Ada 2022)
D.10.1 Синхронные барьеры
Этот подраздел описывает пакет, определенный языком, для синхронного освобождения группы задач после того, как количество заблокированных задач достигнет заданного значения.
Статическая семантика
Существует следующий определённый языком библиотечный пакет:
package Ada.Synchronous_Barriers
with Preelaborate, Nonblocking, Global => in out synchronized is
with Preelaborate, Nonblocking, Global => in out synchronized is
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)
with Nonblocking => False;
Notified : out Boolean)
with Nonblocking => False;
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 для объекта Synchronous_Barrier после его финализации является ошибкой ограниченного типа. Если ошибка обнаружена, возникает исключение Program_Error. В противном случае вызов выполняется нормально, что может привести к вечному блокированию задачи.