信號量問題----父母子女四人喫水果



問題分析:

父親放蘋果  女兒喫蘋果  母親放梨子  兒子喫梨子, 盆子最多放N個水果

mutex = 1;
盆子剩下空間 = N
蘋果數 = 0
梨子數 = 0


父親: 盆子有空就放蘋果.滿了就不放了.
母親: 盆子有空就放梨子.滿了就不放了.
女兒: 盆子有蘋果就喫, 沒有就等
兒子: 盆子有梨子就喫, 沒有就等


父親: p(盆子剩下空間) p(mutex)  ..........  v(mutex) v(蘋果數)
母親: p(盆子剩下空間) p(mutex)  ..........  v(mutex) v(梨子數)
女兒: p(蘋果數) p(mutex)  ..........  v(mutex) v(盆子剩下空間)

兒子: p(梨子數) p(mutex)  ..........  v(mutex) v(盆子剩下空間)


#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <errno.h>

#define total 20

sem_t remain, apple, pear, mutex;
static unsigned int vremain = 20, vapple = 0, vpear = 0;

void *father(void *);
void *mather(void *);
void *son(void *);
void *daughter(void *);
void print_sem();

int main() {
	pthread_t fa, ma, so, da;
	sem_init(&remain, 0, total);//總數初始化爲20
	sem_init(&apple, 0, 0);//盆子中蘋果數, 開始爲0
	sem_init(&pear, 0, 0);//盆子中梨子數, 開始爲0
	sem_init(&mutex, 0, 1);//互斥鎖, 初始爲1

	pthread_create(&fa, NULL, &father, NULL);
	pthread_create(&ma, NULL, &mather, NULL);
	pthread_create(&so, NULL, &son, NULL);
	pthread_create(&da, NULL, &daughter, NULL);

	for(;;);
}

void *father(void *arg) {
	while(1) {
		sem_wait(&remain);
		sem_wait(&mutex);
		printf("父親: 放蘋果之前, 剩餘空間=%u, 蘋果數=%u\n", vremain--, vapple++);
		printf("父親: 放蘋果之後, 剩餘空間=%u, 蘋果數=%u\n", vremain, vapple);
		sem_post(&mutex);
		sem_post(&apple);
		sleep(1);
	}
}

void *mather(void *arg) {
	while(1) {
		sem_wait(&remain);
		sem_wait(&mutex);
		printf("母親: 放梨子之前, 剩餘空間=%u, 梨子數=%u\n", vremain--, vpear++);
		printf("母親: 放梨子之後, 剩餘空間=%u, 梨子數=%u\n", vremain, vpear);
		sem_post(&mutex);
		sem_post(&pear);
		sleep(2);
	}
}

void *son(void *arg) {
	while(1) {
		sem_wait(&pear);
		sem_wait(&mutex);               
		printf("兒子: 喫梨子之前, 剩餘空間=%u, 梨子數=%u\n", vremain++, vpear--);
		printf("兒子: 喫梨子之後, 剩餘空間=%u, 梨子數=%u\n", vremain, vpear);
		sem_post(&mutex);
		sem_post(&remain);
		sleep(3);
	}
}

void *daughter(void *arg) {
	while(1) {
		sem_wait(&apple);
		sem_wait(&mutex);
		printf("女兒: 喫蘋果之前, 剩餘空間=%u, 蘋果數=%u\n", vremain++, vapple--);
		printf("女兒: 喫蘋果之前, 剩餘空間=%u, 蘋果數=%u\n", vremain, vapple);
		sem_post(&mutex);
		sem_post(&remain);
		sleep(3);
	}
}

void print_sem() {
	int val1, val2, val3;
	sem_getvalue(&remain, &val1);
	sem_getvalue(&apple, &val2);
	sem_getvalue(&pear, &val3);
	printf("Semaphore: remain:%d, apple:%d, pear:%d\n", val1, val2, val3);
}

gcc -lpthread -o 執行文件 源文件

運行結果:

父親: 放蘋果之前, 剩餘空間=20, 蘋果數=0
父親: 放蘋果之後, 剩餘空間=19, 蘋果數=1
母親: 放梨子之前, 剩餘空間=19, 梨子數=0
母親: 放梨子之後, 剩餘空間=18, 梨子數=1
兒子: 喫梨子之前, 剩餘空間=18, 梨子數=1
兒子: 喫梨子之後, 剩餘空間=19, 梨子數=0
女兒: 喫蘋果之前, 剩餘空間=19, 蘋果數=1
女兒: 喫蘋果之前, 剩餘空間=20, 蘋果數=0
父親: 放蘋果之前, 剩餘空間=20, 蘋果數=0
父親: 放蘋果之後, 剩餘空間=19, 蘋果數=1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章