1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| int eating = 0, waiting = 0;
Semaphore mutex = 1, queue = 1;
bool must_wait = false;
Customer(){
P(mutex);
if (must_wait){
waiting++;
V(mutex); // 对 waiting 变量的保护可以释放
P(queue); // 被阻塞,坐着等待排队,等待被唤醒
}
else {
eating++;
must_wait = (eating == 5);
V(mutex); // 对 eating 变量的保护可以释放
}
// 上一部分已经解决了进店后是等待还是吃的问题
Eat_sushi();// else 的人和被唤醒的排队者成功进入这一步
P(mutex); // 开启对 eating, waiting 变量保护
eating--; // 吃的人 -1, 如果 5 个没全吃完,不可以换下一批人吃
if (eating == 0){ // 最后一个吃完的人离开才可以进顾客
int n = min(5, waiting); // 放顾客进来的数量,不超过 5 个
waiting -= n;
eating +=n;
must_wait = (eating == 5);
for(int i = 0; i<n; i++){
V(queue); // 唤醒排队的 n 个人继续进程
}
V(mutex); // 允许下一个吃完的人对变量和队列进行操作
}
}
|