一家人吃水果問題(多線程)
一家人吃水果問題是生産者消費者問題的一種變形。問題如下:
- 桌子上有一隻盤子,每次隻能放一個水果;
- 爸爸專向裡面放蘋果,媽媽專放桔子;
- 兒子專吃蘋果,女兒專吃桔子;
- 僅當盤子空閑時,爸爸媽媽才可以向裡面放水果;
- 僅當盤子裡有自己需要的水果時,兒子女兒才可以從裡面取出一隻水果。
試利用線程模拟這個問題,并進行正确的同步。
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
//定義信号量
//盤子空信号量
sem_t empty;//初始值為1,表示目前盤子為空
//蘋果信号量
sem_t apple;//初始值為0,表示目前盤子沒有蘋果
//橘子信号量
sem_t orange;//初始值為0,表示目前盤子沒有橘子
//函數聲明
void* father(void* arg);//父親線程執行函數
void* mother(void* arg);//母親線程執行函數
void* son(void* arg);//兒子線程執行函數
void* daughter(void* arg);//女兒線程執行函數
void* father(void* arg) {
while(1) {
sem_wait(&empty);
// 放入一個蘋果
printf("father --> apple\n");
sem_post(&apple);
sleep(rand() % 10); // 随機休眠一段時間
}
}
void* mother(void* arg)
{
while(1)
{
sem_wait(&empty);
//放入一個橘子
printf("mother --> orange\n");
sem_post(&orange);
sleep(rand() % 10); // 随機休眠一段時間
}
}
void* son(void* arg)
{
while(1)
{ //等盤子不為空才開始執行下面的,盤子不為空說明有橘子或者蘋果
sem_wait(&apple);//當蘋果為1時,做減法,0則不做
printf("son --> apple\n");
//把盤子信号量釋放,表示盤子為空,信号量加1
sem_post(&empty);
sleep(rand() % 10); // 随機休眠一段時間
}
}
void* daughter(void* arg)
{
while(1)
{ //等盤子不為空才開始執行下面的,盤子不為空說明有橘子或者蘋果
sem_wait(&orange);//當橘子為1時,做減法,0則不做
printf("daughter --> orange\n");
//把盤子信号量釋放,表示盤子為空,信号量加1
sem_post(&empty);
sleep(rand() % 10); // 随機休眠一段時間
}
}
int main()
{ //定義父親,母親,兒子,女兒線程
pthread_t fatherThread,motherThread,sonThread,daughterThread;
//初始化信号量,empty 1,orange 0,apple 0;
sem_init(&empty,0,1);
sem_init(&orange,0,0);
sem_init(&apple,0,0);
//建立線程
pthread_create(&fatherThread, NULL, father, NULL);
pthread_create(&motherThread, NULL, mother, NULL);
pthread_create(&sonThread, NULL, son, NULL);
pthread_create(&daughterThread, NULL, daughter, NULL);
pthread_join(fatherThread, NULL);
pthread_join(motherThread, NULL);
pthread_join(sonThread, NULL);
pthread_join(daughterThread, NULL);
}