#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
int empty = 3; // 盘子空位数
int apple = 0; // 苹果数量
int orange = 0; // 橘子数量
sem_t sem; // 互斥信号量
void* father(void *arg) {
while (1) {
sem_wait(&sem);
if (empty > 0) {
apple++;
empty--;
printf("爸爸放苹果,苹果:%d,橘子:%d,空位:%d\n", apple, orange, empty);
sem_post(&sem);
sleep(2);
} else {
sem_post(&sem);
break;
}
}
return NULL;
}
void* mother(void *arg) {
while (1) {
sem_wait(&sem);
if (empty > 0) {
orange++;
empty--;
printf("妈妈放橘子,苹果:%d,橘子:%d,空位:%d\n", apple, orange, empty);
sem_post(&sem);
sleep(2);
} else {
sem_post(&sem);
break;
}
}
return NULL;
}
void* son(void *arg) {
while (1) {
sem_wait(&sem);
if (apple > 0) {
apple--;
empty++;
printf("儿子吃苹果,苹果:%d,橘子:%d,空位:%d\n", apple, orange, empty);
sem_post(&sem);
sleep(3);
} else {
sem_post(&sem);
break;
}
}
return NULL;
}
void* daughter(void *arg) {
while (1) {
sem_wait(&sem);
if (orange > 0) {
orange--;
empty++;
printf("女儿吃橘子,苹果:%d,橘子:%d,空位:%d\n", apple, orange, empty);
sem_post(&sem);
sleep(3);
} else {
sem_post(&sem);
break;
}
}
return NULL;
}
int main() {
pthread_t tid[4];
sem_init(&sem, 0, 1);
pthread_create(&tid[0], NULL, father, NULL);
pthread_create(&tid[1], NULL, mother, NULL);
pthread_create(&tid[2], NULL, son, NULL);
pthread_create(&tid[3], NULL, daughter, NULL);
for (int i = 0; i < 4; i++) {
pthread_join(tid[i], NULL);
}
sem_destroy(&sem);
return 0;
}