补全:模拟真机的稀疏切换
(每道题开头都有同一段:上面的模拟器。判题机要确定的答案,所以本条用「调度表」代替真线程的运气。)
贯穿全条的模拟器:
一条线程 = 一串「步」 inc_steps() = [("read",), ("add", 1), ("write",)] 读共享的 n 进寄存器、寄存器加一、写回
run_schedule(threads, schedule) schedule 是线程编号的序列,每个编号出现一次就让那条线程走一步;交回 (最终 n, 记录)
all_schedules(a, b) 两条线程(a 步、b 步)的全部交错
outcomes(threads) 各种最终值各出现几次
locked(steps) 把一串步包成一个原子步——模拟器遇到它一口气做完真机不是每步都切换。补全 sparse_schedule(a, b, every):两条线程各 a、b 步,先让 0 号连走 every 步、再让 1 号连走 every 步、轮流,直到都走完(每条线程剩不足 every 步就走完剩下的)。看 every = 1、2、3 时两条各加一次的结果。
全部评论