几对有风险
按分析模型,三段加锁序 [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"]]))
全部评论