Immutable object thread-safety
Alcari The Mad
AlcariTheMad at gmail.com
Sun Oct 26 21:53:50 EDT 2008
Laszlo Nagy wrote:
>
>> Also, the other question is the operation st = 'ThreadBWasHere' is
>> atomic?
> I think this is the same question. And I believe it is not atomic,
> because it is actually rebinding a name. Consider this:
>
> a,b = b,a
>
> This will rebind both a and b. In order to be correct, it MUST happen in
> two phases: first calculate the right side, then do the rebind to the
> names on the left side. The expression on the right side can be anything
> that executes for a long time, and can even rebind 'a' and 'b' several
> times, and will probably be paused by other threads etc. So the
> assignment above cannot be atomic.
You are correct.
a,b = b,a
yields the bytecode:
1 0 LOAD_NAME 0 (b)
3 LOAD_NAME 1 (a)
6 ROT_TWO
7 STORE_NAME 1 (a)
10 STORE_NAME 0 (b)
Which is most definitely not atomic.
>
> I strongly feel that if such an assignment is not atomic for "a,b = b,a"
> then int wont be atomic for "a+=b" or eveb "a=b" or any other
> assignment. However, I can be completely wrong. :-)
'a = b' requires two bytecodes:
1 0 LOAD_NAME 0 (b)
3 STORE_NAME 1 (a)
>> I mean, if Python does not guarantee if an immutable object
>> assignment is atomic, then how can we say that the object is thread-
>> safe?
> An assigment rebinds name to an object. It is assignment to a name.
> Assigning immutable and mutable objects to names are not specially
> distinguished.
>> So, if it is an atomic operation, which operators are atomic,
>> means only assignment'='?
> I don't think that '=' operator is atomic, see above.
>> I am confused about which data structure to rely on thread-safety, or
>> operator in Python?
>>
> The immutable object itself will never change state, so it is thread
> safe. The problem is not with the object, but the dictionary which holds
> the name 'b' and 'a' and 'st' in your example. It is mutable, and so
> must be protected in a threaded application.
I would suggest reading up on using the 'with' statement and
thread.allocate_lock().
>
> Best,
>
> Laszlo
>
More information about the Python-list
mailing list