桌上有一空盘,允许存放一种水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一个水果供吃者取用。
要求:请用信号量机制实现爸爸、儿子、女儿三个并发进程的同步。
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
// 定义信号量
sem_t empty; // 盘子是否为空
sem_t apple; // 盘子中的苹果数量
sem_t orange; // 盘子中的橘子数量
// 爸爸放水果的操作
void *father(void *arg) {
while (1) {
sem_wait(&empty); // 盘子为空时,爸爸才可以放水果
if (rand() % 2 == 0) {
printf("爸爸把一个苹果放进盘子里。\n");
sem_post(&apple);
} else {
printf("爸爸把一个橘子放进盘子里。\n");
sem_post(&orange);
}
}
return NULL;
}
// 儿子取水果
void *son(void *arg) {
while (1) {
sem_wait(&orange);
printf("儿子从盘子里吃了一个橘子。\n");
sem_post(&empty);
}
return NULL;
}
// 女儿取水果
void *daughter(void *arg) {
while (1) {
sem_wait(&apple);
printf("女儿从盘子里吃了一个苹果。\n");
sem_post(&empty);
}
return NULL;
}
int main() {
pthread_t father_thread, son_thread, daughter_thread;
// 初始化信号量
sem_init(&empty, 0, 1); // 盘子初始为空
sem_init(&apple, 0, 0); // 初始苹果
sem_init(&orange, 0, 0); // 初始橘子
pthread_create(&father_thread, NULL, father, NULL);
pthread_create(&son_thread, NULL, son, NULL);
pthread_create(&daughter_thread, NULL, daughter, NULL);
pthread_join(father_thread, NULL);
pthread_join(son_thread, NULL);
pthread_join(daughter_thread, NULL);
sem_destroy(&empty);
sem_destroy(&apple);
sem_destroy(&orange);
return 0;
}