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?我不明白为什么:在尘埃落定后,净效应(输出)是否应该相同?
答案 0 :(得分:3)
不一定。想象一下以下一系列事件。我们将在程序运行一段时间后的精确时刻开始; Thread1
和Thread2
都在for
个圈内,x = 0
Thread1
有控制权。它访问x
以确定x + 1
的值; x
为0
,因此结果为1
。然而... Thread1
完成作业之前,控件会转到Thread2
。 x
仍为0
。 Thread2
现在访问x
。它计算x - 1
,-1
,因为x
仍为0
。由于线程计时的不可预测性,它设法完成操作,将-1
分配给x
。 Thread1
。它已将x + 1
的值计算为1
。它将1
分配给x
。两个线程都已完成迭代,x
的值应为0
,但其实际值为1
。
答案 1 :(得分:2)
这是多线程计算中的经典并发问题。每个线程必须从内存中读取x的当前值,修改它,然后将其写回。如果线程1读取该值,则线程2更新它,当线程1将值写回时,它将取消线程2的更新。这就是为什么你总是使用正确的同步结构,如信号量等。
答案 2 :(得分:1)
这是一种经典的竞赛条件。 Wiki对这种情况有一个很好的解释。