2012-04-28 11 views
6
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 

結果は999 私のテストでは+ =スレッドセーフであるようです 私の質問は+ =本当にスレッドセーフですか?はPythonスレッドセーフで+ =ですか?

+0

があなたのスレッドの任意の2あなたを信じます実際には同じ時間に走っていたのですか? – stark

+0

テストによる糸の安全性を確認しようとすると、無知または狂気の徴候があります。スレッドセーフなものではないということは、何百万回も逸脱していないという理由だけで、特定の動作に頼ることができないということです。 –

答えて

10

+=はスレッドセーフではありません(source)。

18

、以下のように操作x += 1は4つのオペコードを取るよういいえ、それはスレッドセーフではありません。

の中から選択
4   0 LOAD_GLOBAL    0 (x) 
       3 LOAD_CONST    1 (1) 
       6 INPLACE_ADD   
       7 STORE_GLOBAL    0 (x) 

>>> 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   
+3

+1を分解する方法を示すために!ニースのトリック! :) – johndodo

関連する問題