condition | declaration |
Syntax | A conditionDeclaration is:
| ||||||||||||||||||
Description | A condition is essentially a queue of sleeping processes. It is used in a concurrent program to allow processes to block themselves (by the wait statement) and later to be awakened (by the signal statement). A condition variable, which can occur only inside a monitor (a special kind of module that handles concurrency) or monitor class, is used by the wait and signal statements for putting processes to sleep and later waking them up.
| ||||||||||||||||||
Example | The processes use this monitor to gain exclusive access to a resource. A process wanting to use the resource calls the request entry point and is blocked until the resource is free. When the process is finished with the resource, it calls the release entry point. This monitor is essentially a binary semaphore in which the semaphore's P operation is the request and the V is the release.
monitor resource export request, release var available : boolean := true var nowAvailable : condition procedure request if not available then wait nowAvailable % Go to sleep end if assert available available := false % Allocate resource end request procedure release assert not available % Resource is allocated available := true % Free the resource signal nowAvailable % Wake up one process % If any are sleeping end release end resource process worker loop … resource.request % Block until available … use resource … resource.release end loop end worker fork worker % Activate one worker fork worker % Activate another worker | ||||||||||||||||||
Execute | |||||||||||||||||||
Details | A conditionOption is one of:
The priority option requires that the corresponding wait statements include priorities. Options (b) and (c) declare deferred conditions. A signal to a deferred condition causes the signaled process to become ready to enter the monitor when the monitor becomes inactive. The signaling process continues running in the monitor. A signal to an immediate (non deferred) condition causes the signaled process to begin running in the monitor immediately. The signaling process waits to re-enter the monitor when the monitor becomes inactive. All conditions in a device monitor must be deferred (or timeout). A timeout option means the signaling is deferred and that an extra parameter to the wait statement must give a timeout interval. If a process waits longer than its interval, it is automatically signaled. Beware that the empty function can be non-repeatable when applied to timeout conditions. For example, empty(c) may not be equal to empty(c) in a single expression. In the current (1999) version of Turing, the time for time outs is measured in simulation time rather than real time. See the pause statement. Conditions cannot be named as types, cannot be contained in records, unions or collections and cannot be declared in statements (such as begin or loop) or in subprograms. They can only be declared in monitors and monitor classes. There is no guaranteed order of progress among awakened deferred processes, processes signaling immediate conditions, and processes attempting to enter an active monitor. Note that conditionOption must precede the keyword condition.
| ||||||||||||||||||
See also | wait and signal. See also monitor and fork. See also empty. See also pause.
|