问题
应用程序中包含并发线程的执行时,协调处理共享资源的代表性问题
五位哲学家住在一座房子,他们面前有一张餐桌,每个哲学家生活中只有思考和吃饭。经多年思考,哲学家们认为最有助于思考的事物是意大利面。因缺乏手工功能,每位哲学家需要用两把叉子来吃意大利面。如图:
每个哲学家面前有个盘子,左右两边各一个叉子。现在设计一个算法来让哲学家就餐。算法必须互斥(没有两个哲学家能同时用一把叉子),同时要避免死锁、饥饿
分析
每个哲学家都是一个线程,相应的,筷子是被共享资源,所以需要被保护起来
解决
使用信号量解决
每位哲学家首先拿起左边的叉子,然后拿起右边的叉子。在哲学家吃完饭后,这两把叉子又被放回桌子上。
semaphore fork[5]={
1};
int i;
void philosopher(int i)
{
while(1)
{
think();
wait(fork[i]);
wait(fork[(i+1) mod 5]);
eat();
signal(fork[(i+1) mod 5]);
signal(fork[i]);
}
}
int