Python多线程和不一致的输出
多次运行此命令会产生不同的输出,有些是负数,有些是正数。是因为两个线程使用相同的全局x吗?我不明白为什么:尘埃落定后的净效应(输出)不应该是一样的吗?这是一个经典的比赛条件。对这种情况有很好的解释。这是一个经典的竞争条件。对这种情况有很好的解释。不一定。想象一下下面的事件序列。我们将在程序运行一段时间后的精确时刻开始;Python多线程和不一致的输出,python,multithreading,concurrency,Python,Multithreading,Concurrency,多次运行此命令会产生不同的输出,有些是负数,有些是正数。是因为两个线程使用相同的全局x吗?我不明白为什么:尘埃落定后的净效应(输出)不应该是一样的吗?这是一个经典的比赛条件。对这种情况有很好的解释。这是一个经典的竞争条件。对这种情况有很好的解释。不一定。想象一下下面的事件序列。我们将在程序运行一段时间后的精确时刻开始;Thread1和Thread2都位于for循环的内,并且x=0 Thread1具有控制权。它访问x,以确定x+1的值x是0,因此结果是1。然而 在Thread1完成分配之前,控制传
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
。想象一下下面的事件序列。我们将在程序运行一段时间后的精确时刻开始;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
这是多线程计算中的一个经典并发问题。每个线程必须从内存中读取x的当前值,修改它,然后写回。如果线程1读取该值,那么线程2将更新该值,当线程1写回该值时,它将取消线程2的更新。这就是为什么您应该始终使用适当的同步结构,如信号量等。这是多线程计算中的一个典型并发问题。每个线程必须从内存中读取x的当前值,修改它,然后写回。如果线程1读取该值,那么线程2将更新该值,当线程1写回该值时,它将取消线程2的更新。这就是为什么您应该始终使用适当的同步结构,如信号量等。您的操作不是原子的。你应该使用锁来获得正确的结果。你的操作不是原子的。您应该使用锁来获得正确的结果。
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;