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.