Python多线程和不一致的输出

时间:2012-12-01 22:11:01

标签: python multithreading concurrency

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?我不明白为什么:在尘埃落定后,净效应(输出)是否应该相同?

3 个答案:

答案 0 :(得分: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
  5. 两个线程都已完成迭代,x的值应为0,但其实际值为1

答案 1 :(得分:2)

这是多线程计算中的经典并发问题。每个线程必须从内存中读取x的当前值,修改它,然后将其写回。如果线程1读取该值,则线程2更新它,当线程1将值写回时,它将取消线程2的更新。这就是为什么你总是使用正确的同步结构,如信号量等。

答案 2 :(得分:1)

这是一种经典的竞赛条件。 Wiki对这种情况有一个很好的解释。