I've been thinking about using GNU pth to implement threads in Emacs.
GNU pth only does cooperative threading, and has special non-blocking
versions of some syscalls (blocking the current thread instead of the
whole process). Ideally this would mean that existing
(i.e. non-yielding) Lisp code would not be affected, and network code
could be run in a background thread.
The greatest obstacle to this seems to be shallow binding - you'd have
to unwind one thread's stack and rewind another's when switching
threads. Maybe there's an easier way that I don't see...