D.10.1 Synchronous Barriers
This subclause introduces a language-defined package
to synchronously release a group of tasks after the number of blocked
tasks reaches a specified count value.
The following language-defined
library package exists:
Preelaborate, Nonblocking, Global => in out synchronized is
1 .. implementation-defined
Synchronous_Barrier (Release_Threshold : Barrier_Limit) is limited private
Wait_For_Release (The_Barrier : in out
Notified : out
Nonblocking => False;
-- not specified by the language
Type Synchronous_Barrier needs finalization (see
Each call to Wait_For_Release blocks the calling
task until the number of blocked tasks associated with the Synchronous_Barrier
object is equal to Release_Threshold, at which time all blocked tasks
are released. Notified is set to True for one of the released tasks,
and set to False for all other released tasks.
The mechanism for determining which task sets Notified
to True is implementation defined.
Once all tasks have been released, a Synchronous_Barrier
object may be reused to block another Release_Threshold number of tasks.
As the first step of the finalization of a Synchronous_Barrier,
each blocked task is unblocked and Program_Error is raised at the place
of the call to Wait_For_Release.
It is implementation defined whether an abnormal
task which is waiting on a Synchronous_Barrier object is aborted immediately
or aborted when the tasks waiting on the object are released.
This paragraph was
Bounded (Run-Time) Errors
It is a bounded error to call Wait_For_Release on
a Synchronous_Barrier object after that object is finalized. If the error
is detected, Program_Error is raised. Otherwise, the call proceeds normally,
which may leave a task blocked forever.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe