交付:三处锁的毛病一起修

交付:三处锁的毛病一起修

场景:~/账本/账本.py 做三件事:转账、审计、递归合计。里面有三处锁的毛病:没锁的、拿了不放的、自己等自己的——跑起来卡住,就算不卡总额也不对。说明.txt 写了三个应有的数。 任务:都修好,让它

阅读更多 →
最多三个同时

最多三个同时

场景:~/下载/下载.py 开十来条线程各打开一个连接,打印「峰值 P 完成 N」——现在峰值等于线程数,服务器受不了。 任务:用 threading.Semaphore(或 BoundedSemap

阅读更多 →
消费者要等

消费者要等

场景:~/流水/流水.py 生产者慢慢放 N 件、消费者取 N 件。现在消费者一上来就取,队列还是空的——报错,最后打印「取到 0 件」。 任务:让消费者「等到有货再取」——用 threading.C

阅读更多 →
递归自锁

递归自锁

场景:~/部门/合计.py 递归算「总部」的总人数,每层都拿同一把锁——一跑就卡住。说明.txt 写了正确的合计。 任务:换成能重入的锁修好它,让它打印正确的「合计 T」。规则:递归和锁都要保留。修好

阅读更多 →
两把锁保护同一个变量

两把锁保护同一个变量

场景:~/统计/统计.py 三个共享变量各被两个函数改,程序有两把锁。三个变量本该都是 30,跑出来有一个不对。对照表列了八个名字。 任务:找出那个变量——它的两个函数拿的不是同一把锁。到对照表里查它

阅读更多 →
拿了不放,程序卡住

拿了不放,程序卡住

场景:~/任务/跑.py 处理一批任务,最后该打印「完成 K」——可它跑起来就不动了,永远不退出,也不报错。说明.txt 写了 K。 任务:找出锁没放开的那条路,用 with 或 try/finall

阅读更多 →
哪个函数忘了拿锁

哪个函数忘了拿锁

场景:~/账本/账本.py 四个碰共享余额的函数,说好都用同一把锁——有一个忘了。对照表列了八个名字。 任务:找出没拿锁的那个函数,到对照表里查它的名字对应的标记。 可操作范围:只在分给你的这台实验机

阅读更多 →
给账本加锁

给账本加锁

场景:~/账本/账本.py 几条线程互相转账(读-睡-写、没锁),总额每次都不对。说明.txt 写了账户数、次数和应有的总额。 任务:用 threading.Lock 把转账保护起来,让它每次都打印正

阅读更多 →
从报错和卡住认锁的毛病

从报错和卡住认锁的毛病

真机上四种现象各对应一种锁的毛病。把现象和毛病配对,打印四个字母: signs = { "总额每次不同": "A", "程序永远不退出

阅读更多 →
真机上锁修好了怎么验

真机上锁修好了怎么验

给一段有竞争的程序加了锁,真机上确认「修好了」的做法是【0】。

阅读更多 →