桌子上有一只盘子,最多可容纳5个水果,每次只能放入或取出一个水果。爸爸专向盘子中放苹果(apple),妈妈专向盘子中放橘子(orange),儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。使用互斥信号量操作编程实现来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系的模拟
时间: 2024-12-25 13:29:21 浏览: 5
要使用互斥信号量(mutex)来实现这个场景,我们可以创建四个信号量,分别代表苹果区、橘子区以及两个孩子访问盘子的状态。互斥信号量确保任何时候只有一个家庭成员可以对盘子进行操作。下面是C语言的一个简单示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#define MAX_FRUITS 5
#define NUM_FAMILIES 4
// 信号量定义
sem_t apples, oranges, son_access, daughter_access;
void dad(int fruit) {
sem_wait(&apples); // 爸爸等待苹果区空闲
printf("爸爸往盘子中放了一个苹果...\n");
if (fruit == 'a') { // 检查是否为苹果
sem_post(&oranges); // 放置后释放橘子区
}
sem_post(&apples); // 妈妈和儿子开始时不能立即取走苹果,所以这里也释放
}
void mom(int fruit) {
sem_wait(&oranges); // 妈妈等待橘子区空闲
printf("妈妈往盘子中放了一个橘子...\n");
if (fruit == 'o') { // 检查是否为橘子
sem_post(&apples); // 放置后释放苹果区
}
sem_post(&oranges);
}
void son() {
while (1) {
sem_wait(&son_access); // 儿子等待进入
sem_wait(&apples); // 如果有苹果,儿子吃掉并离开
if (sem_getvalue(&apples, &count) == SEM_VALUE_ZERO) break;
printf("儿子吃了个苹果,盘子里还有%d个苹果。\n", count);
sem_post(&apples);
sem_post(&son_access);
}
printf("儿子离开了盘子区域。\n");
}
void daughter() {
while (1) {
sem_wait(&daughter_access); // 女儿等待进入
sem_wait(&oranges); // 如果有橘子,女儿吃掉并离开
if (sem_getvalue(&oranges, &count) == SEM_VALUE_ZERO) break;
printf("女儿吃了个橘子,盘子里还有%d个橘子。\n", count);
sem_post(&oranges);
sem_post(&daughter_access);
}
printf("女儿离开了盘子区域。\n");
}
int main() {
sem_init(&apples, 0, MAX_FRUITS);
sem_init(&oranges, 0, MAX_FRUITS);
sem_init(&son_access, 0, 1);
sem_init(&daughter_access, 0, 1);
dad('a'); // 爸爸放第一个苹果
mom('o'); // 妈妈放第一个橘子
son(); // 儿子吃苹果
daughter(); // 女儿吃橘子
// 清理资源
sem_destroy(&apples);
sem_destroy(&oranges);
sem_destroy(&son_access);
sem_destroy(&daughter_access);
return 0;
}
```
在这个例子中,`sem_wait`用于获取信号量(互斥),如果信号量为零则阻塞;`sem_post`用于释放信号量。爸爸和妈妈通过互斥信号量控制各自的水果放置,儿子和女儿通过互斥信号量确保每次只有一个孩子可以访问盘子。
阅读全文