在python线程安全中是+ =?

tru*_*com 7 python

globalnum = 0
n = 1

class T( threading.Thread ):
  def run( self ):
    global globalnum
    globalnum += n

for _ in xrange( 0, 999 ):
  t = T()
  t.start()

print globalnum
Run Code Online (Sandbox Code Playgroud)

结果是999在我的测试中我似乎+ =线程安全我的问题是:是+ =真的线程安全吗?

Dan*_* D. 18

不,它不是线程安全的,因为该操作x += 1需要4个操作码,如下所示:

  4           0 LOAD_GLOBAL              0 (x)
              3 LOAD_CONST               1 (1)
              6 INPLACE_ADD         
              7 STORE_GLOBAL             0 (x)
Run Code Online (Sandbox Code Playgroud)

选出的:

>>> import dis
>>> def test():
...     global x
...     x += 1
...     
... 
>>> dis.disassemble(test.func_code)
  4           0 LOAD_GLOBAL              0 (x)
              3 LOAD_CONST               1 (1)
              6 INPLACE_ADD         
              7 STORE_GLOBAL             0 (x)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

  • +1表示如何拆解!好戏!:) (3认同)

Amb*_*ber 10

+=不是线程安全的().