python - 为什么这段代码不会导致竞争条件?
问题描述
我正在处理一个需要多个线程来更改共享内存的问题。为了了解这在 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 次,因此这是正确答案。谁能解释为什么这不会导致比赛条件?
解决方案
它确实会导致竞争条件。您当前的范围不足以对此进行评估。实际上,在下一个线程可以启动之前,第一个启动的线程已经完成。
需要足够长的时间才能不再出现这种情况的具体数字将取决于您的计算机资源,对我来说,将增量函数修改为更大的界限确实会导致 val 在每次运行时都是不同的值。
def increment(a):
for _ in range(1_000_000):
a.val += 1
推荐阅读
- c++ - 我应该如何修复我的 BMP280 传感器或 Arduino 代码以获得输出?
- odoo - 在 many2one 字段中添加图像
- laravel-8 - 从 laravel 8 的公用文件夹中删除目录
- python - python plot在使用重复绘图时会创建灰色框
- memory-management - Libgdx:处理无法在 android 上运行的屏幕
- python-3.x - Python - 来自函数的值
- python - 计算非连续收益熊猫的夏普比率
- vba - 更新 UserForm1 中的 RowSource 后关闭 UserForm2 时,UserForm1 冻结
- android - 使用环境变量时如何在 ktor 中进行测试?
- ruby-on-rails - [Rails]如何使用 Kaminari 通过 FotmData 的 POST 方法进行分页