atomic operations in presence of multithreading
Dave Brueck
dave at pythonapocrypha.com
Tue Jul 27 18:16:47 EDT 2004
Paul Moore wrote:
> Peter Hansen <peter at engcorp.com> writes:
>
>
>>Dave Brueck wrote:
>>
>>
>>>Glenn Kasten wrote:
>>>
>>>
>>>>I am wondering which operations in Python
>>>>are guaranteed to be atomic in the presence
>>>>of multi-threading. In particular, are assignment
>>>>and reading of a dictionary entry atomic?
>>>
>> > [...]
>>
>>>Basically: multiple threads can't corrupt the interpreter's
>>>internals (but a buggy C extension could).
>>
>
> [...]
>
>
>>The key instructions in the above are the dictionary lookup,
>>which is merely "BINARY_SUBSCR" in func(), and the dictionary
>>assignment, which is "STORE_SUBSCR" in func2(). If func
>>and func2 were in separate threads, either the lookup or
>>the store executes first, then the other, but they cannot
>>both be executing at the same time.
>
>
> As was pointed out to me when this came up recently, it is possible
> for callbacks into python to screw this simple picture up a little.
>
> The obvious case is a user-defined class with a __setitem__ method. In
> this case, STORE_SUBSCR calls arbitrary Python code, and so can be
> interrupted by a thread switch.
>
> Given that the original question was about dictionaries, which are
> coded in C (and so not subject to this issue) there is still the
> following case: when the old value stored in the dictionary is
> replaced, that could be the last reference to it. When the old value
> is freed, its __del__ method gets called - arbitrary Python code
> again.
>
> But the basic idea is sound. The interpreter releases the GIL *only*
> between Python bytecodes. As long as you cater for recursive cases
> like the above (and obvious ones like CALL_METHOD), you're OK.
Yep, though I think the OP was mostly concerned with Python's internals
gettin messed up by unlocked multithreaded access, so he doesn't have to
be concerned about the above.
-Dave
More information about the Python-list
mailing list