这两段冲突吗
按分析模型,一段按 [L1,L2] 加锁、另一段按 [L2,L1],shared_inversion 交回什么?
真实代码分析模型:把每段代码的加锁顺序记成一个锁名列表。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(shared_inversion(["L1", "L2"], ["L2", "L1"]))
全部评论