几对有风险

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

按分析模型,三段加锁序 [L1,L2]、[L2,L1]、[L1,L2],risky_pairs 交回几对?

真实代码分析模型:把每段代码的加锁顺序记成一个锁名列表。shared_inversion(a, b) 判两段对「共同的锁」顺序是否相反(相反=有死锁风险);risky_pairs(funcs) 数有多少对彼此逆序;safe_all(funcs) 判是否两两都一致。

def shared_inversion(seq1, seq2):
    # 两段代码各自的加锁序;若对两把共同的锁顺序相反 -> 有死锁风险
    common = set(seq1) & set(seq2)
    o1 = [l for l in seq1 if l in common]
    o2 = [l for l in seq2 if l in common]
    return o1 != o2


def risky_pairs(funcs):
    # funcs: 若干段代码的加锁序;交回有多少对彼此顺序相反(有风险)
    n = 0
    for i in range(len(funcs)):
        for j in range(i + 1, len(funcs)):
            if shared_inversion(funcs[i], funcs[j]):
                n += 1
    return n


def safe_all(funcs):
    # 所有代码段两两之间都不逆序,才整体安全
    return risky_pairs(funcs) == 0

print(risky_pairs([["L1", "L2"], ["L2", "L1"], ["L1", "L2"]]))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论