补全:从记录里认出丢更新

(每道题开头都有同一段:上面的模拟器。判题机要确定的答案,所以本条用「调度表」代替真线程的运气。) 贯穿全条的模拟器: 一条线程 = 一串「步」 inc_steps() = [("read",), ("a

开始练习 →

补全:检查-再-动作

(每道题开头都有同一段:上面的模拟器。判题机要确定的答案,所以本条用「调度表」代替真线程的运气。) 贯穿全条的模拟器: 一条线程 = 一串「步」 inc_steps() = [("read",), ("a

开始练习 →

为什么真机上大多数时候对

模拟器里 90% 的交错都错,可真机上不加 sleep 跑一万次可能全对。因为【0】。

开始练习 →

为什么危险

「跑了一万次都对」的程序,上线后【0】。

开始练习 →

什么算证明

要证明一段并发代码没有竞争,可信的做法是【0】。

开始练习 →

概率乘次数

假设一次读-改-写被插队的概率是 p,每天做 k 次。算一算每天出错的期望次数,和「一天至少出一次」的概率: p = 0.000001 for k in (1000, 1000000, 100000000): expect = p

开始练习 →

补全:模拟真机的稀疏切换

(每道题开头都有同一段:上面的模拟器。判题机要确定的答案,所以本条用「调度表」代替真线程的运气。) 贯穿全条的模拟器: 一条线程 = 一串「步」 inc_steps() = [("read",), ("a

开始练习 →

补全:出错概率随切换点变化

(每道题开头都有同一段:上面的模拟器。判题机要确定的答案,所以本条用「调度表」代替真线程的运气。) 贯穿全条的模拟器: 一条线程 = 一串「步」 inc_steps() = [("read",), ("a

开始练习 →

补全:多跑几次的统计

真机上会拿到一串结果(每次运行一个数)。补全 summarize(results, expect):交回「总次数/不一致次数/比例(整数百分比)/最小值」用 / 连的字符串。

开始练习 →

标记的依据

贯穿 n07 的程序(一个小仓库),每行标了它碰的数据: 1 total = total + amount # 共享 total,写 2 log = [] # 本地 3

开始练习 →