libthread_xu pthread_exit() behaviour

David Xu bsddiy at
Sat Sep 24 17:58:23 PDT 2005

Simon 'corecode' Schubert wrote:

at the moment I'm looking at the threading stuff and I found some issues:

If the main() thread pthread_exit()s, the "process" visible to the 
parent will exit.  This is because the kernel doesn't have the notion of 
"threads" and "processes":  The pid of the "process" goes away and thus 
all other threads become background processes (threads).

I am not sure where this is handled best.  Maybe in kernel when dealing 
with p->p_peers (see next point):

If the main() thread exit()s, it won't tear down all other threads.  
This is an easy fix:  just use RFTHREAD in the rfork_thread() and this 
works as expected.  On the other hand if the main thread pthread_exit()s 
(see above) it will kill all other threads as well.

If we want the kernel to keep thread leaders around (sleeping?) until 
all peers have been pthread_exit()ed, we need a way for the userland to 
signal to the kernel that the thread is actually pthread_exit()ing and 
not trying to tear down all threads with exit() [new syscall?]

Am I missing something?  Comments welcome!

If any thread calls exit(), all other threads will be killed
by kernel, I think there should be a syscall to only exit current
thread. The main thread should be given the exit code by
the thread calling exit(), the race multiple threads calling exit()
has to be resolved, execv() has same problem, the main thread
has to be kept. if main thread calls pthread_exit(), it should stay
in userland or kernel, but howto interact with debugger will complicate
things a bit. Another thing is POSIX behavior signal handling, a
thread got a STOP signal should be suspend all threads, a SIGCONT has
to resume all threads, the main thread shouldn't report SIGCHLD to
parent until all others threads are suspended, there might have other
trickies, a signal sent to main thread should dispatch the signal
to another threads which is not masking it, there should have another
syscall to only send a signal to a thread, this is for pthread_kill().
I am just slowly working in it.
David Xu

More information about the Kernel mailing list