首页 > 解决方案 > 为什么这段代码不会导致竞争条件?

问题描述

我正在处理一个需要多个线程来更改共享内存的问题。为了了解这在 python 中是如何工作的,我开发了以下代码来查看是否可以获得竞态条件:

import threading


class A:
    def __init__(self):
        self.val = 0


def increment(a):
    for _ in range(10):
        a.val += 1


def main():
    a = A()
    threads = [threading.Thread(target=increment, args=(a,)) for _ in range(4)]
    for t in threads:
        t.start()

    for t in threads:
        t.join()

    print(a.val)


if __name__ == '__main__':
    main()

很简单的东西。每个线程都应该尝试同时增加 a.val,这应该会导致竞争条件,因为该值不受锁保护。然而,这种情况并非如此。每次我运行这段代码时,a.val 的打印值为 40。由于有四个线程,每个线程将 a.val 递增 10 次,因此这是正确答案。谁能解释为什么这不会导致比赛条件?

标签: pythonmultithreadingpython-multithreadingrace-condition

解决方案


它确实会导致竞争条件。您当前的范围不足以对此进行评估。实际上,在下一个线程可以启动之前,第一个启动的线程已经完成。

需要足够长的时间才能不再出现这种情况的具体数字将取决于您的计算机资源,对我来说,将增量函数修改为更大的界限确实会导致 val 在每次运行时都是不同的值。

def increment(a):
    for _ in range(1_000_000):
        a.val += 1

推荐阅读