用c语言实现桌上有一空盘,允许存放一只水果。爸爸可向盘中存放苹果,也可向盘中存放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
时间: 2023-12-10 22:39:18 浏览: 127
以下是用C语言实现的爸爸、儿子、女儿三个并发进程的同步:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
// 定义信号量和盘中水果
sem_t apple, orange, plate;
int fruit;
// 爸爸进程
void *father(void *arg) {
while (1) {
int f = rand() % 2; // 随机放入苹果或桔子
sem_wait(&plate); // 等待盘子为空
if (f == 0) {
fruit = 1; // 放入苹果
printf("Father puts an apple on the plate.\n");
sem_post(&apple); // 通知女儿
} else {
fruit = 2; // 放入桔子
printf("Father puts an orange on the plate.\n");
sem_post(&orange); // 通知儿子
}
}
pthread_exit(NULL);
}
// 儿子进程
void *son(void *arg) {
while (1) {
sem_wait(&orange); // 等待放入桔子
if (fruit == 2) {
printf("Son eats an orange from the plate.\n");
sem_post(&plate); // 将盘子置为空
}
}
pthread_exit(NULL);
}
// 女儿进程
void *daughter(void *arg) {
while (1) {
sem_wait(&apple); // 等待放入苹果
if (fruit == 1) {
printf("Daughter eats an apple from the plate.\n");
sem_post(&plate); // 将盘子置为空
}
}
pthread_exit(NULL);
}
int main() {
pthread_t tid[3]; // 线程ID
sem_init(&apple, 0, 0);
sem_init(&orange, 0, 0);
sem_init(&plate, 0, 1);
fruit = 0;
pthread_create(&tid[0], NULL, father, NULL);
pthread_create(&tid[1], NULL, son, NULL);
pthread_create(&tid[2], NULL, daughter, NULL);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
pthread_join(tid[2], NULL);
sem_destroy(&apple);
sem_destroy(&orange);
sem_destroy(&plate);
return 0;
}
```
爸爸进程随机放入苹果或桔子,如果盘子为空则等待,放入水果后通过信号量通知等待的儿子或女儿进程。儿子进程等待桔子放入,如果盘中有桔子则取出并吃掉,将盘子置为空。女儿进程等待苹果放入,如果盘中有苹果则取出并吃掉,将盘子置为空。通过P、V原语的信号量实现了三个进程的同步。
阅读全文