Concurrency requires the activities of concurrently running methods to
be synchronized. Critical data must be safeguarded so diverse methods on other
activities do not perform concurrent updates. Guarded methods satisfy both
these needs.
A guarded method combines
the UNGUARDED option of the ::METHOD directive or the SETUNGUARDED method
of the Method class with the GUARD instruction.
The UNGUARDED option and the SETUNGUARDED method both provide
unconditional concurrency. Including a GUARD instruction in a method makes
concurrency conditional:
If the
expression on the GUARD
instruction evaluates to
.true, the
method continues to run. If the
expression
on the GUARD instruction evaluates to
.false, the method does not
continue running. GUARD reevaluates the
expression whenever the value
of an exposed object variable changes. When the expression evaluates to
1, the method resumes running. You can use
GUARD to block running any method when proceeding is not safe.
(See
Section 2.9, “GUARD” for details about GUARD.)
It is important to ensure that you use an expression
that can be fulfilled. If the condition expression cannot be met, GUARD ON
WHEN puts the program in a continuous wait condition. This can occur in
particular when several activities run concurrently. In this case, a second
activity can make the condition expression invalid before GUARD ON WHEN can
use it.
To avoid this, ensure that the GUARD ON WHEN statement is executed before
the condition is set to true. Keep in mind that the sequence of running activities
is not determined by the calling sequence, so it is important to use a logic
that is independent of the activity sequence.