[Python-Dev] PyFAQ: thread-safe interpreter operations

Armin Rigo arigo at tunes.org
Tue Nov 21 22:56:20 CET 2006


Hi Martin,

On Tue, Nov 21, 2006 at 09:24:07PM +0100, "Martin v. L?wis" wrote:
> As for the original questions: "x+=1" is two "atomic"
> operations, not one. Or, more precisely, it's 4 opcodes,
> not 2.

Or, more interestingly, the same is true for constructs like 'd[x]+=1':
they are a sequence of three bytecodes that may overlap other threads
(read d[x], add 1, store the result back in d[x]) so it's not a
thread-safe way to increment a counter.

(More generally it's very easy to forget that expr1[expr2] += expr3
really means

    x = expr1;  y = expr2;  x[y] = x[y] + expr3

using a '+' that is special only in that it invokes the __iadd__ instead
of the __add__ method, if there is one.)


A bientot,

Armin


More information about the Python-Dev mailing list