As I mentioned in my last reply to Paul Koning, that can't occur in the
Burroughs/Unisys stack architecture I was discussing earlier. Application code can only
access what it has created by pushing words onto the stack, and then only access those
stack frames that are in the lexicographical scope of the currently-executing procedure.
It can't access memory outside of that current scope, except through references and
descriptor words, which are protected by memory tags and managed only by the combination
of the hardware and OS.
Those systems do not have threads in the same way that most other systems do. We call them
sub-tasks or dependent asynchronous tasks. They each have their own stack, which is linked
back to the specific stack frame that initiated them (the so-called "critical
block"). Addressing within the sub-task is subject to the same scope rules as the
parent task, although that scope can extend across stacks into the parent's stack. If
the parent task exits a critical block for which there are active sub-tasks, the parent
and all of its children (and their children -- the whole tree of sub-tasks) is terminated
by the OS because the dependency chains have been broken. Applications are just not
allowed to mess with the structure of their stacks.