[Python.NET] AcquireThreadLock - bug? future?
Brian Lloyd
brian at zope.com
Mon Mar 14 13:07:31 CET 2005
Essentially the engine needs to own the thread lock in
order to call Python C API functions. When a (managed)
method is called, the MethodBinder:
- releases the lock (so that other threads could
potentially run)
- calls the managed method
- re-acquires the lock after the call (because it
needs to use the C API again to Pythonify the
result, etc.)
So it sounds like some thread is unable to re-acquire
the lock. This gets tricky _really_ quickly, because
you can actually be calling a managed object that may
later call back into Python code... etc.
Note that this doesn't happen for properties, because I
arbitrarily decided that since properties are expected to
to be lightweight that it wasn't worth the overhead ;)
Brian Lloyd brian at zope.com
V.P. Engineering 540.361.1716
Zope Corporation http://www.zope.com
> -----Original Message-----
> From: pythondotnet-bounces at python.org
> [mailto:pythondotnet-bounces at python.org]On Behalf Of Roman Yakovenko
> Sent: Monday, March 14, 2005 1:24 AM
> To: pythondotnet at python.org
> Subject: [Python.NET] AcquireThreadLock - bug? future?
>
>
> Hi. I have small problem with multithreading and need help to solve it.
> I have dll written in managed C++. Within dll I have class that has
> static function. I'd like to call this function from a few threads
> from python. I failed to do this. Calling function staled and this is
> a stack dump from debugger ( of my program )
>
> python.runtime.dll!Python.Runtime.PythonEngine.AcquireThreadLock()
> + 0x40 bytes
>
> python.runtime.dll!Python.Runtime.MethodBinder.Invoke(int inst =
> 11793552, int args = 9900080, int kw = 0) + 0xf0 bytes
>
> python.runtime.dll!Python.Runtime.MethodObject.Invoke(int target =
> 11793552, int args = 9900080, int kw = 0) + 0x25 bytes
>
> python.runtime.dll!Python.Runtime.MethodBinding.tp_call(int ob =
> 11794928, int args = 9900080, int kw = 0) + 0x137 bytes
>
> I don't understand:
> 1. Why Python.Net tries to acquire thread lock, while calling
> function ?
> I am possible to call get property from a few threads. From
> managed C++ point of view ( I could be wrong here ) getting value of
> property it is just syntax sugaring for get_??? call. I want to say
> that if I able to call "get property" from a few threads I should be
> able to call function from a few threads.
> 2. Why at all Python.Net tries to synchronize function calls?
>
> I can modify and compile source code of Python.Net, but I know to
> little about reasons
> of calling AcquireThreadLock.
>
> Thanks for help
>
> Roman
> _________________________________________________
> Python.NET mailing list - PythonDotNet at python.org
> http://mail.python.org/mailman/listinfo/pythondotnet
>
More information about the PythonDotNet
mailing list