谁被饿死了
按饥饿模型,线程有 A/B/C,调度序列是 A A C,starved 交回谁?
活锁/饥饿模型:polite(rounds)——两线程对称礼让(都发现对方也要就退回重来),谁也拿不全,交回完成数(对称下 0);starved(schedule, threads)——交回从没被调度到的线程(被饿死的);classify(progress, someone_done)——都不动→死锁、在动没人完成→活锁、有人完成但有线程总轮不到→饥饿。
def polite(rounds):
# 两个线程都「发现对方也要,就礼让、退回去重来」——对称礼让,谁也拿不全
# 交回 rounds 轮里成功完成的线程数(对称下永远 0 = 活锁)
done = 0
for _ in range(rounds):
# 双方同时让:都退,没人推进
pass
return done
def starved(schedule, threads):
# schedule 是被调度到的线程序列;交回从没被调度到的线程(排序),就是被饿死的
ran = set(schedule)
return sorted(t for t in threads if t not in ran)
def classify(progress, someone_done):
# progress=系统整体是否还在动;someone_done=有没有线程真正完成
# 都不动 -> 死锁;在动但没人完成 -> 活锁;在动、有人完成但某个总轮不到 -> 饥饿
if not progress:
return "死锁"
if not someone_done:
return "活锁"
return "饥饿"
print(",".join(starved(["A", "A", "C"], ["A", "B", "C"])))
全部评论