[sane-devel] pthread_detach after pthread_join generates segfault
jmozdzen at nde.ag
Thu Aug 27 13:19:05 UTC 2015
> I'm no expert either, but your basic analysis seems correct- once you
> have returned from pthread_join(), the thread is gone, and its return
> value has been popped.
that's indeed the way it works. Upon return of pthread_join(), the
thread is *gone*... unless it returns with a non-zero rc.
> I suppose it is possible that the pthread_join
> could fail in a way that might leave the thread running, perhaps
> because of a deadlock? In that case I suppose we could call
> pthread_detatch only if there is an error?
Other reasons to for pthread_join() to fail would be an already
pending pthread_join() in a different thread.
It's not necessary/valid to call pthread_detach() on all error cases -
i.e. in case of ESRCH, there is no thread with that id. Calling
pthread_detach() then will only return ESRCH itself, the same holds
true for EINVAL.
What doesn't fit the problem description is that calling
pthread_detach() for an already terminated thread results in a segv.
I'd rather have expected a return of ESRCH in such case. The only
unspecified result (per man page) is for calling pthread_detach()
multiple times on the same thread. Might this be the case here?
> I wonder why it took 11 years to spot that ;)
If it is a case of calling pthread_detach() multiple times, it may be
because the code got compiled for a new platform. "undefined results"
include causes a segv :D. Or maybe the pthread lib contains a bug,
i.e. segfaulting on detaching a no longer existing thread, rather than
returning ESRCH, or some race condition.
More information about the sane-devel