FreeBSD pthread_equal "bug"
Kern Sibbald
kern at sibbald.com
Wed Jun 4 09:45:21 PDT 2003
On Wed, 2003-06-04 at 17:30, Daniel Eischen wrote:
> On 4 Jun 2003, Kern Sibbald wrote:
> > Hello,
> >
> > I've run into what I consider a bug in the FreeBSD
> > implementation of pthreads and pthread_equal() in
> > particular. Basically, pthread_equal() will return
> > true even if it is not the same thread. This can occur
> > when one thread dies and another one starts. The second
> > thread then takes on the exact identity of the the
> > first thread, and pthread_equal() returns true for a
> > case where it is a different thread. You may argue
> > that the first thread is dead so its thread id is no
> > longer valid. True, but think about how Unix would
> > work if every process started up with the process
> > id of the last process to exit.
>
> Process id's can wrap around so it can eventually happen.
Yes, true. However, on Solaris and Linux, it takes a long time,
for the pthread_id to wrap around, and on FreeBSD it happens in
microseconds.
>
> This is a bug in the application; the implementation is allowed
> to reuse thread id's and there are enough interfaces for an
> application to tell when a thread terminates (pthread_join).
I'm not sure what the POSIX specification says,
if I were programming it, I would not be content
with the FreeBSD current implementation especially
considering that both Solaris and Linux do it "correctly".
> Perhaps our use of thread id's could be changes so that they
> were cached at the end of the free thread list, but cacheing
> them at the front seems to highlight bad applications, so
> that's a bonus ;-)
This bug does not highlight bad applications because most
programmers will reasonably expect that pthread_equal() will
not be the same for two different threads. It took me
a long time to find this problem because I just could not
imagine that pthread_equal() was not "working".
This problem is extremely subtle and is likely to cause
unsuspecting applications long months of bizarre
behavior.
Fix it or not, that is your choice. Now that I know
that you don't handle it as I would suspect I can code
around it.
More information about the freebsd-threads
mailing list