在此c语言代码中,桌上有一个能盛得下5个水果的空盘子。爸爸不停地向盘中放苹果和橘子,儿子不停地从盘中取出橘子享用,女儿不停地从盘中取出苹果享用。规定3人不能同时向(从)盘子中放(取)水果。试用信号量机制来实现爸爸、儿子和女儿这3个“循环进程”之间的同步。
时间: 2024-03-22 12:42:18 浏览: 207
以下是使用信号量机制实现爸爸、儿子和女儿同步的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_FRUIT 5 //盘子中最多能放的水果数量
sem_t empty; //盘子中还可以放入的水果数量
sem_t full; //盘子中可以取出的水果数量
void *father(void *arg) {
while (1) {
sem_wait(&empty); //等待盘子中还可以放入的水果数量
//放入一个苹果或橘子
printf("Father puts a fruit into the plate.\n");
sem_post(&full); //增加盘子中可以取出的水果数量
sleep(rand() % 3); //随机休眠一段时间
}
}
void *son(void *arg) {
while (1) {
sem_wait(&full); //等待盘子中可以取出的水果数量
//取出一个橘子
printf("Son takes an orange from the plate.\n");
sem_post(&empty); //增加盘子中还可以放入的水果数量
sleep(rand() % 3); //随机休眠一段时间
}
}
void *daughter(void *arg) {
while (1) {
sem_wait(&full); //等待盘子中可以取出的水果数量
//取出一个苹果
printf("Daughter takes an apple from the plate.\n");
sem_post(&empty); //增加盘子中还可以放入的水果数量
sleep(rand() % 3); //随机休眠一段时间
}
}
int main() {
pthread_t tid_father, tid_son, tid_daughter;
sem_init(&empty, 0, MAX_FRUIT); //初始化盘子中还可以放入的水果数量为5
sem_init(&full, 0, 0); //初始化盘子中可以取出的水果数量为0
srand(time(NULL)); //设置随机数种子
pthread_create(&tid_father, NULL, father, NULL);
pthread_create(&tid_son, NULL, son, NULL);
pthread_create(&tid_daughter, NULL, daughter, NULL);
pthread_join(tid_father, NULL);
pthread_join(tid_son, NULL);
pthread_join(tid_daughter, NULL);
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
```
在该代码中,父亲、儿子和女儿分别对应了三个线程,使用信号量机制进行同步。程序运行时,三个线程不断地进行放水果和取水果的操作,直到程序被手动终止。运行结果如下:
```
Father puts a fruit into the plate.
Son takes an orange from the plate.
Father puts a fruit into the plate.
Daughter takes an apple from the plate.
Son takes an orange from the plate.
Father puts a fruit into the plate.
Daughter takes an apple from the plate.
Son takes an orange from the plate.
...
```
阅读全文