试判断一个消息队列是否可能死锁。

消息队列的缓冲区长度为L单位,读操作为每次从缓冲区读取R单位,写操作为每次写入缓冲区W单位。
消息队列会持续进行读写操作。具体为写操作会在缓冲区还剩余大于等于W单位空间时保持进行,当缓冲区内空间小于W时,写操作停止,等待读操作进行;类似的,读操作会在缓冲区可读内容大于等于R时保持进行,当可读内容小于R时,读操作停止,等待写操作进行。读写都是原子操作。
若读写操作均无法进行,定义此时状态为死锁。
给定L,R,W,问消息队列是否可能进入死锁状态,若能,输出YES,否则输出NO 

输入描述:
第1行输入N(N<=10)表示数据组数。
从第2行到第N+1行,每行三个整数L,R,W。

输出描述:
输出N行,每行输出'YES'或'NO'

输入例子1:
2
5 2 3
5 3 4

输出例子1:
NO
YES

昨天做搜狗笔试题发现的题目,自己目前来说没有发现任何规律,所以只能用最笨的方法做。如果能一直写读下去,则判为不会出现死锁,否则就会。由于Python的最大递归次数判为1000,这里10次就够了。所以只能通过这一性让那个递归停止。不知道小伙伴有没有更好的方法。以下是我的方法。

import sys
stack=[]
count = 0
def islock(l,w,r,stack,count):    
    count += 1
    if count == 10:
        return True
    while l-len(stack)>=w:
        for i in range(0,w):
            stack.append(1)
    while len(stack)>=r and len(stack)>0:
        for i in range(0,r):
            stack.pop()
    while l-len(stack)<w and len(stack)<r:
        return False
    return True and islock(l,w,r,stack,count)
if __name__ == "__main__":
    data=[]
while True:
    line = sys.stdin.readline().strip()
    if not line:
        break
    tmp = list(map(int, line.split(" ")))
    data.append(tmp)
i=1
while i<len(data):
    if islock(data[i][0],data[i][2],data[i][1],stack,count)==True:
        print('NO')
    else:
        print('YES')
    i=i+1

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值