文章
267
粉丝
1101
获赞
1683
访问
136w
方法一
综合考虑碗的数量m和最大可进餐名额数量n-1,限制碗的数量为 min{m, n-1},得到新的最大可进餐名额数量。
伪代码如下:
semaphore bowls = min(n-1, m); // 可用碗数量即可进餐名额数量
semaphore chopsticks[n]; // 所有筷子资源的信号量
for (int i=0; i<n; i++) {
chopsticks[i] = 1;
}
CoBegin
Process 哲学家i() {
while (true) {
思考;
P(bowls);
P(chopsticks[i]); // 取左边筷子
P(chopsticks[(i+1)%n]); // 取右边筷子
进餐;
V(chopsticks[i]); // 放回左边筷子
V(chopsticks[(i+1)%n]); // 放回右边筷子
V(bowls);
}
}
CoEnd
方法二
仅当哲学家的左、右两只筷子和碗均可用时,才允许他拿起筷子进餐。
这里需要引入互斥信号量,保证进餐请求能够按照顺序执行,根据银行家算法,对于任意一个请求序列,均存在安全序列,不会产生死锁。
这里拿左、右两只筷子和碗的顺序不会影响结果的正确性。
semaphore bowls = m; // 所有碗资源的信号量
semaphore mutex = 1; // 保证每个时刻只有一个哲学家取筷子的互斥信号...
登录后发布评论
暂无评论,来抢沙发