Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Bug in threading.Thread.join() ?

Reply
Thread Tools

Bug in threading.Thread.join() ?

 
 
Peter Hansen
Guest
Posts: n/a
 
      03-24-2005
I'm still trying to understand the behaviour that I'm
seeing but I'm already pretty sure that it's either
a bug, or something that would be considered a bug if
it didn't perhaps avoid even worse behaviour.

Inside the join() method of threading.Thread objects,
a Condition named self.__block is acquired, and then
the wait logic is executed. After the wait() finishes,
self.__block is released and the method returns.

If you hit Ctrl-C while the join's wait() is occurring,
you'll raise a KeyboardInterrupt and bypass the
release() call. (I'm observing this on Win XP with
Python 2.4 but have no reason to think it wouldn't
work the same on other platforms, given the docs
on signals and such.) If you do this, the thread
you were waiting for will never be able to complete
its cleanup because __bootstrap() calls __stop()
and that tries to acquire the same Condition object,
which has never been released. (I suspect this will
happen only if its the MainThread that is doing
the join() call since KeyboardInterrupts only occur
in the main thread.)

A simple try/finally in join() appears to solve the
problem, but I'm unsure that this is a good idea,
partly because I'm a little surprised nobody else has
found this problem before and I lack confidence that
I've really found a bug.

Anyone have thoughts on this? I'll file a bug
report shortly unless someone can point out the
error in my reasoning or a reason why this must be
the way it is.

-Peter
 
Reply With Quote
 
 
 
 
Tim Peters
Guest
Posts: n/a
 
      03-26-2005
[Peter Hansen]
> I'm still trying to understand the behaviour that I'm
> seeing but I'm already pretty sure that it's either
> a bug, or something that would be considered a bug if
> it didn't perhaps avoid even worse behaviour.
>
> Inside the join() method of threading.Thread objects,
> a Condition named self.__block is acquired, and then
> the wait logic is executed. After the wait() finishes,
> self.__block is released and the method returns.
>
> If you hit Ctrl-C while the join's wait() is occurring,
> you'll raise a KeyboardInterrupt and bypass the
> release() call.
>
> (I'm observing this on Win XP with
> Python 2.4 but have no reason to think it wouldn't
> work the same on other platforms, given the docs
> on signals and such.)


Then you're doing something other than what you described. Here on
WinXP SP2 w/ Python 2.4c2:

>>> import threading
>>> class T(threading.Thread):

.... def run(self):
.... import time
.... while True:
.... time.sleep(1)
....
>>> t =T()
>>> t.start()
>>> t.join()


I can hit Ctrl+C all day at this point, and nothing (visible) happens.
That's because it's sitting in self.__block.wait(), which is in turn
sitting in waiter.acquire(), and it's simply not possible for Ctrl+C
to interrupt a mutex acquire.

> If you do this, the thread you were waiting for will never be able
> to complete its cleanup because __bootstrap() calls __stop()
> and that tries to acquire the same Condition object,
> which has never been released. (I suspect this will
> happen only if its the MainThread that is doing
> the join() call since KeyboardInterrupts only occur
> in the main thread.)
>
> A simple try/finally in join() appears to solve the
> problem, but I'm unsure that this is a good idea,
> partly because I'm a little surprised nobody else has
> found this problem before and I lack confidence that
> I've really found a bug.
>
> Anyone have thoughts on this?


As above, I don't know what you're doing. Maybe you're doing a join()
with a timeout too? In that case, I doubt anyone gave any thought to
what happens if you muck with KeyboardInterrupt too.
 
Reply With Quote
 
 
 
 
Peter Hansen
Guest
Posts: n/a
 
      03-26-2005
Tim Peters wrote:
> [Peter Hansen]
>>If you hit Ctrl-C while the join's wait() is occurring,
>>you'll raise a KeyboardInterrupt and bypass the
>>release() call.


> Then you're doing something other than what you described. Here on
> WinXP SP2 w/ Python 2.4c2:

[snip]
> I can hit Ctrl+C all day at this point, and nothing (visible) happens.
> That's because it's sitting in self.__block.wait(), which is in turn
> sitting in waiter.acquire(), and it's simply not possible for Ctrl+C
> to interrupt a mutex acquire.
>
> As above, I don't know what you're doing. Maybe you're doing a join()
> with a timeout too? In that case, I doubt anyone gave any thought to
> what happens if you muck with KeyboardInterrupt too.


Yes, definitely doing this with a timeout value on the join().
Changing your example to do that (join(5), say) pretty
much demonstrates the trouble... in this case a traceback
for KeyboardInterrupt is printed, but the program does not
terminate because of the thread stuck at the __stop()'s
__acquire().

I'll take your last sentence as a form of blessing to go
file a bug report, unless you don't think that's a good idea.

Thanks, Tim!

-Peter
 
Reply With Quote
 
Peter Hansen
Guest
Posts: n/a
 
      03-26-2005
Peter Hansen wrote:
> I'll take your last sentence as a form of blessing to go
> file a bug report...


Filed as
http://sourceforge.net/tracker/index...70&atid=105470

I guess it makes more sense for any further discussion to
go on there...

(Coincidentally, another bug report was filed just a few days
ago for a closely related item. As Tim mentioned, the wait()
without a timeout can never be interrupted by Ctrl-C, and
somebody else reported that as a bug (1167930) only about three
days before I encountered this one.)

-Peter
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
*bug* *bug* *bug* David Raleigh Arnold Firefox 12 04-02-2007 03:13 AM
ASP.NET Login control bug or SQL 2005 bug? RedEye ASP .Net 2 12-13-2005 10:57 AM
Re: BUG? OR NOT A BUG? John ASP .Net 2 09-21-2005 10:31 AM
Bug Parade Bug 4953793 Michel Joly de Lotbiniere Java 4 12-02-2003 05:05 AM
how to report bug to g++ ? got a bug and fixed up source code DarkSpy C++ 4 06-27-2003 09:05 AM



Advertisments