补全:把标记变成锁
(每道题开头都有同一段:上面的模拟器。判题机要确定的答案,所以本条用「调度表」代替真线程的运气。)
贯穿 n07 的程序(一个小仓库),每行标了它碰的数据:
1 total = total + amount # 共享 total,写
2 log = [] # 本地
3 log.append("入库") # 本地
4 if stock >= need: # 共享 stock,读(检查)
5 stock = stock - need # 共享 stock,写(动作)
6 count = count + 1 # 共享 count,写
7 print(total) # 共享 total,只读
8 name = name.upper() # 本地把第 1、6 行(各自一个读-改-写)和第 4、5 行(检查-再-动作)翻成步,补全 protect(thread):thread 是 [("inc", 步列表), ("local", 步列表), …],把标着 inc / checkact 的段各包成原子步,local 的保持原样,拼成一条线程。验证两条这样的线程所有交错都不会超卖也不丢更新。
全部评论