一次拿全成了吗

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

按 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"))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论