一次拿全成了吗
按 trylock 模型,A 想一次拿全 [L1,L2],L2 被 B 占着,acquire_all 交回什么?
trylock 模型:try_round(want, held_by, me)——想要的锁被别人占着就「放弃重试」(连自己的一起松手),否则「拿到」;acquire_all(want, held_by, me)——一次要拿全 want,有一把被占就全放弃回「重试」、都空回「成功」。松手重试打破「持有并等待」。
def try_round(want, held_by, me):
# 想拿的锁若被别人占着:trylock 拿不到 -> 放弃(连自己持有的一起松开),交回 "放弃重试"
# 没被占 -> 交回 "拿到"
if want in held_by and held_by[want] != me:
return "放弃重试"
return "拿到"
def acquire_all(want, held_by, me):
# trylock 一次拿全 want 里的锁:只要有一把被别人占着就全放弃、交回 "重试",都空交回 "成功"
for lk in want:
if lk in held_by and held_by[lk] != me:
return "重试"
return "成功"
def resolves(a_holds, a_want, b_holds, b_want):
# 两个线程各占一把、又想要对方那把:trylock 下至少一个会放弃松手,能收场(不死等)
# 只要不是「两边都死等」就 True;trylock 永远能收场
return True
print(acquire_all(["L1", "L2"], {"L2": "B"}, "A"))
全部评论