2012-12-01 75 views
1
import threading 

x = 0; 

class Thread1(threading.Thread): 
    def run(self): 
     global x 
     for i in range(1,100000): 
      x = x + 1 

class Thread2(threading.Thread): 
    def run(self): 
     global x 
     for i in range(1,100000): 
      x = x - 1 

#create two threads 
t1 = Thread1() 
t2 = Thread2() 

#start the threads 
t1.start() 
t2.start() 

#wait for the threads to finish 
t1.join() 
t2.join() 

print x; 

多次運行會產生不同的輸出,其中一些輸出爲負數,一些輸出爲正數。是否因爲這兩個線程正在使用相同的全局x?我不明白爲什麼:所有的塵埃落定之後,淨效應(輸出)不應該相同嗎?Python多線程和輸出不一致

+1

你的操作是不是原子。你應該使用鎖來獲得正確的結果。 – akaRem

回答

3

不一定。想象下面的一系列事件。我們將在程序運行一段時間後的精確時刻開始;既Thread1Thread2是他們for循環裏面,x = 0

  1. Thread1擁有控制權。它訪問x以確定x + 1的值; x0,所以結果是1。但是...
  2. Thread1完成任務之前,控制權轉移到Thread2x仍然是0
  3. Thread2現在訪問x。它計算x - 1,這是-1,因爲x仍然是0。由於線程時序的不可預測性,它設法完成操作,將-1分配給x
  4. 控制現在返回到Thread1。它已經計算出x + 1的值爲1。它將1分配給x

兩個線程完成一個迭代,並x值應爲0,但它的實際價值1

1

這是一個古典的競賽條件。 Wiki對這種情況有很好的解釋。

2

這是多線程計算中經典的併發問題。每個線程都必須從內存中讀取x的當前值,對其進行修改,然後將其寫回。如果線程1讀取值,則線程2會更新它,當線程1將值寫回時,它將取消線程2的更新。這就是爲什麼你應該總是使用適當的同步結構,如信號燈等