- var chopstick: array[0, ..., 4] of semaphore := 1;
- codebegin
- begin
- 思考
- P(chopstick[i]);
- P(chopstick[(i+1)mod5]);
- 进餐
- V(chopstick[i]);
- V(chopstick[(i+1)mod5]);
- end
- codeend
- //上述算法,每位哲学家进餐前总是先取左边筷子,成功后,再取右边筷子。如果5位科学家同时
- //都拿起了左边的筷子,再试图去拿右边的筷子时,则会死锁
- //解决方法采取以下措施:
- //(1)最多只允许思维哲学家同时进餐,这样就能保证至少意味哲学家能拿到两只筷子进餐
- //(2)给所有哲学家编号,并规定奇数号的哲学家必须先拿左边的筷子,然后再拿右边的筷子,而偶数
- //号的哲学家则相反。最多总有一个哲学家总能拿到两只筷子