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

4

3 回答 3

3

不必要。想象以下事件序列。我们将在程序运行一段时间后的精确时刻开始;两者Thread1Thread2在它们的for循环内,并且x = 0

  1. Thread1有控制权。它访问x以确定x + 1; x0,所以结果是1。然而...
  2. Thread1完成分配之前,控制权传递给Thread2x还在0
  3. Thread2现在访问x. 它计算x - 1,也就是-1,因为x是静止的0。由于线程时间的不可预测性,它设法完成操作,分配-1x.
  4. 控制现在返回到Thread1。它已经计算出x + 1to be的值1。它分配1x

两个线程都完成了一次迭代, 的值x应该是0,但它的实际值是1

于 2012-12-01T22:31:52.683 回答
2

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

于 2012-12-01T22:33:14.307 回答
1

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

于 2012-12-01T22:29:37.213 回答