本文共 915 字,大约阅读时间需要 3 分钟。
由荷兰学者提出的哲学家进餐问题(The Dinning Philosophers Problem)是经典的同步问题之一。
有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,该哲学家进餐完毕后,放下左右两只筷子又继续思考。
约束条件
(1)只有拿到两只筷子时,哲学家才能吃饭。
(2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。
(3)任一哲学家在自己未拿到两只筷子吃完饭前,不会放下手中已经拿到的筷子。
筷子是,一段时间只允许一位哲学家使用。为了表示互斥,用一个表示一只筷子,五个信号量构成信号量数组。本文中算法用描述伪码算法。算法描述如下:n用五支筷子的信号量构成信号量数组:
Semaphore chopstick[5]={ 1,1,1,1,1};p(stick[i]);p(stick[(i+1) % 5]);
进餐;
v(stick[i]); v(stick[(i+1) % 5]);
思考;
当哲学家饥饿时,总是先去拿他左边的筷子,执行wait(chopstick[I]),成功后,再去拿他右边的筷子,执行wait(chopstick[I+1]%5);成功后便可进餐。进餐毕,先放下他左边的筷子,然后再放下右边的筷子。当五个哲学家同时去取他左边的筷子,每人拿到一只筷子且不释放,即五个哲学家只得无限等待下去,引起。
**解决科学家进餐方案一:**规定奇数号科学家先拿左边的筷子,然后拿右边的筷子。偶数号科学家先拿右边的筷子,然后那左边的筷子。导致0,1科学家竞争1号筷子,2,3科学家竞争3号筷子。四号科学家无人竞争。最后总有一个科学家能获得两只筷子。
**解决科学家进餐方案二:**仅当科学家左右两只筷子都能用的时候,才允许他进餐:
ReentrantLock tryLock()
解决科学家进餐方案三:
至多允许四个哲学家同时去拿左边的筷子,最终保证至少有一个科学家能进餐,并且用完之后释放筷子,从而使更多的哲学家能够拿到筷子。
转载地址:http://aqdki.baihongyu.com/