哲学家进餐问题和死锁概述

死锁的四种情况:

(1)互斥条件:一个资源一次只能被一个进程使用。

(2)请求和保持条件:当一个进程被请求资源阻塞时,它将保持所获得的资源。

(3)非剥夺条件:进程获得的资源在用完之前不能被强制剥夺。

(4)循环等待条件:几个进程之间形成循环等待资源关系。

先写一个会造成死锁的哲学家问题。当所有哲学家决定同时吃饭,拿起左边的筷子时,僵局就发生了。

解决方案1:打破死锁的循环等待条件。

不再按照左手右手的顺序拿起筷子。选择一个固定的全局顺序获取,这里给筷子添加id,按照id从小到大获取(不要在意编号的具体规则,只要编号是全局唯一有序的),不会出现死锁。

方法2:破坏死锁的请求和保持条件,利用锁的特性为锁获取操作设置超时。这不会死锁(至少不会无休止的死锁)

方法3:设置一个与锁相关联的条件遍历。这个方法只用了一把锁,没有筷子类,把争夺筷子的比赛变成了状态的判断。只有当你的邻居不吃饭的时候,你才能吃饭。并且提高了并发性。以前的方法,只有一个哲学家吃饭,其他人拿着一根筷子在等另一个。在这个方案中,当一个哲学家理论上能吃东西(邻居不吃),他肯定能吃。