5.2 Issues in multitasking
catch
and throw
to allow a transfer of control in which the destination is determined by the dynamic environment. In addition, the special formunwind-protect
ensures that certain cleanup code is always executed, even if there is athrow
from within the protected form of theunwind-protect
to a tag outside of theunwind-protect
. In the Multitasking Facility, each process maintains its own stack ofcatch
tags andunwind-protect
forms. When a process uses the special formthrow
to perform a nonlocal control transfer, its stack is searched to find the appropriate tag and its unwind-protect
cleanup forms are executed; stacks from other processes are not searched.
If your program is running in one process and you need to have another process exit its computation, you can use the functioninterrupt-process
to cause the other process to perform a throw, as the following example demonstrates:
(interrupt-process *some-process* #'(lambda () (throw 'tag value)))If
process-wait
or a related function has suspended*some-process*
, this code causes the process to wake up and throw to the appropriate tag. This method is the only way that a process can return from a call to the functionprocess-wait-forever
. When you use the functionkill-process
to kill a process, all the unwind-protect
cleanup forms that are pending on that process's stack are performed before the process is killed. If a cleanup form contains athrow
, ago
, or areturn
to a location outside of the cleanup form, the unwinding of the stack is aborted.
You can use the optional argument:suppress-unwind-protects
tokill-process
to kill the process immediately without attempting to execute cleanup forms or to unwind the stack. However, this method of killing a process is dangerous and should only be used as a last resort when a more reasonable method will not work. Files in the process are not closed, locks are not released, and all other details of process cleanup are lost.
Generated with Harlequin WebMaker