Thanks for that, I had no idea. Were those actual shared-state threads or processes? Just wondering about the use of "fork".
Shared-state threads in the same memory space. They could do I/O independently, lock and unlock critical sections, and block on semaphores. Worked fine. To create a new thread, you called FORK$. See section 8, page 2, of the 1966 EXEC 8 manual.[1]
Here are Djykstra's P and V functions for the UNIVAC 1108, to run in user space. Written in 1972.[2]
I once added support for threads to Pascal for that machine. Had to add per-thread stacks and manage non-contiguous stack growth.
[1] https://ia601603.us.archive.org/27/items/bitsavers_univac110...
When I went from EXEC 8 to UNIX in 1978, my main observation was that the I/O was better but the CPU management in UNIX was much worse.