[C++-sig] Managing the GIL across competing threads

Adam Preble adam.preble at gmail.com
Fri Mar 16 06:04:45 CET 2012


I edited the post so many times I forgot the subject line!  I am a bad
person.

Maybe the most condensed question here is: How do you normally manage
multiple resources competing with the GIL in a way that could cause
deadlocks with it?  For the details, see the long post.

On Thu, Mar 15, 2012 at 11:59 PM, Adam Preble <adam.preble at gmail.com> wrote:

> I discovered recently that during callbacks to Python objects, sometimes
> the interpreter would try to do stuff at the same time, despite the fact I
> made a call to ensure the GIL.  I read the solution for that kind of thing
> I'm doing is calling PyEval_InitThreads().  This worked at first, but like
> more race conditions and stuff, all it takes is walking away from the
> computer for it all to fall apart.
>
> What I'm seeing is a rather elaborate deadlock situation revolved around
> securing the GIL.  I think I need to basically put my interpreter in its
> own subsystem, design-wise, and ferret calls to invoke things in the
> interpreter to it, in order to ultimately get around this.  However, what
> I'm asking of the distribution is how they've gotten around this.
>
> To give something a little more concrete--this is pretty gross:
> 1. Main thread starts interpreter and is running a script
> 2. The script defines an implementation of callback interface A
> 3. The script starts some objects that represent threads in the C++
> runtime.  These are threads 1 and 2.
> 4. The script starts to create an object that is wrapped from C++
> 5. The object requires a resource from thread 1, where I use promises and
> futures enqueue and fulfill the request when thread #1 isn't busy.
> 6. Meanwhile, the interpreter thread is waiting for the resource since it
> cannot put it off any further
> 7. At this point, thread 2 tries to invoke the callback to interface A,
> and it needs the interpreter thread.
> 8. thread #1 needs thread #2 to complete this critical step before the
> get() call will complete for the master interpreter thread
> 9. Thread #2 needs thread #1 to finish so it can get the GIL.  It's
> basically locked up in PyGILState_Ensure().
>
> Heck of a deadlock.  I am pondering having something else control the
> interpreter in its own thread and have everybody enqueue stuff up to run in
> it, like with the promises and futures I'm using elsewhere already.  The
> reason is that thread #2 doesn't really need to steal the interpreter at
> that very exact moment.  And furthermore, I'm trying to use Stackless, and
> it's my understanding there I can link it up so that the interpreter gets
> ahold of the Python runtime at controlled intervals--if desired--to invoke
> other stuff.
>
>
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20120316/258454e5/attachment-0001.html>


More information about the Cplusplus-sig mailing list