Deadlock and a rather weird stacktrace
Ian
hobson42 at gmail.com
Thu Mar 10 06:57:33 EST 2011
On 10/03/2011 09:48, Vincent wrote:
> Can nobody explain this? Please. how can a sleep() continue in a
> __bootstrap() ?
>
> Regards,
> Vincent
>
> On 4 feb, 13:39, Vincent van Beveren<V.vanBeve... at rijnhuizen.nl>
> wrote:
>> Hi everyone,
>>
>> I'm currently working on a multithreaded GUI system in Python 2.6. In this system I use conditions to coordinate synchronization. However, one condition suddenly locks, without any cause. As a last resort I have written a small routine to dump all the stack traces.
>>
>> def dumpAllStacks(self):
>> for threadId, stack in sys._current_frames().items():
>> print "Thread with Id: %s" % threadId
>> traceback.print_stack(stack)
>>
>> When the system is dead-locked, I invoke this method. One stack-trace strikes me as odd:
>>
>> Thread with Id: 1568
>> File "c:\PYTHON26\lib\threading.py", line 497, in __bootstrap
>> self.__bootstrap_inner()
>> File "c:\PYTHON26\lib\threading.py", line 525, in __bootstrap_inner
>> self.run()
>> File "c:\PYTHON26\lib\threading.py", line 477, in run
>> self.__target(*self.__args, **self.__kwargs)
>> File "c:\PYTHON26\lib\site-packages\magnum\gui\autogui.py", line 2558, in __sendDataLoop
>> self.__sendDataCondition.wait(1)
>> File "c:\PYTHON26\lib\threading.py", line 256, in wait
>> _sleep(delay)
>> File "c:\PYTHON26\lib\threading.py", line 497, in __bootstrap
>> self.__bootstrap_inner()<<===== What?
>> File "c:\PYTHON26\lib\threading.py", line 525, in __bootstrap_inner
>> self.run()
>> File "c:\PYTHON26\lib\site-packages\magnum\subsys\__init__.py", line 2242, in run
>> self.updateTask()
>> File "c:\PYTHON26\lib\site-packages\magnum\subsys\__init__.py", line 2214, in updateTask
>> self.statusServerModule.updateTaskWithConnection(self.statusServerConnection)
>> File "c:\PYTHON26\lib\site-packages\magnum\subsys\shared\modules.py", line 2450, in updateTaskWithConnection
>> self.updateDataWithConnection(connection, updateAll)
>> File "c:\PYTHON26\lib\site-packages\magnum\subsys\shared\modules.py", line 2488, in updateDataWithConnection
>> self.updateVariableData(varDataDict, frozenset(varDataDict))
>> File "c:\PYTHON26\lib\site-packages\magnum\subsys\shared\modules.py", line 796, in updateVariableData
>> self.cmdMgr.updateVariableData(self.moduleId, varDataDict, forceVarIdSet) # after this varMgr makes deepcopy
>> File "c:\PYTHON26\lib\site-packages\magnum\subsys\shared\managers.py", line 441, in updateVariableData
>> self.notifyUpdateReport(updatedData)
>> File "c:\PYTHON26\lib\site-packages\magnum\subsys\shared\managers.py", line 493, in notifyUpdateReport
>> with self.updateReportCondition:
>> File "c:\PYTHON26\lib\threading.py", line 205, in __enter__
>> return self.__lock.__enter__()
>> File "c:\PYTHON26\lib\threading.py", line 121, in acquire
>> rc = self.__block.acquire(blocking)
>>
>> Can someone tell me how the sleep of one thread can continue as the 'run' of another? Is this normal? Thanks in advance!
>>
>> Regards,Vincentvan Beveren
>>
>> ___
>> Ing. V. van Beveren
>> Software Engineer, FOM Rijnhuizen
>> T: +31 (0) 30-6096769
>> E: V.vanBeve... at rijnhuizen.nl
Hi Vincent,
I can't explain it, - I am no expert - but I did have some thoughts that
I put forward anyway.
It would appear from the stack trace that self.run() is being called
within self.run(). Did you perhaps start a third thread from within a
second thread?
The first thread is the only one with a stack at start-up, and therefore
it has to be the thread that sets up the stack swapping needed for
multi-threading. If a background thread later starts to create threads,
it is doing so from an unusual situation, and its stack could result in
the sort of double run() stack you see above.
I don't think it matters - the thread will die or return to the pool
when its run() exits, and the extra stack is used only by the creating
thread, and
not the new threads.
It might also be that anything above the first run() call is reported
incorrectly when dumped from another thread.
Have you checked the caveats at the bottom of
http://docs.python.org/library/thread.html#module-thread You might be
tripping up on one of those.
Regards
Ian
More information about the Python-list
mailing list