2012-12-01 78 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的更新。这就是为什么你应该总是使用适当的同步结构,如信号灯等