操作系统多个生产者多个消费者问题

题目如下:
一家人吃水果问题是生产者消费者问题的一种变形。问题如下:
• 桌子上有一只盘子,每次只能放一个水果;
• 爸爸专向里面放苹果,妈妈专放桔子;
• 儿子专吃苹果,女儿专吃桔子;
• 仅当盘子空闲时,爸爸妈妈才可以向里面放水果;
• 仅当盘子里有自己需要的水果时,儿子女儿才可以从里面取出一只水果。
试利用线程模拟这个问题,并进行正确的同步。

问题解决:
盘子只允许放置一个水果,则可以不使用互斥信号量。
只需要三个信号量即可:
empty: 盘子空信号量
apple: 苹果信号量
orange: 橘子信号量
原因:在任何时刻,empty,apple,orange三个同步信号
量最多只有一个是1,几个线程一开始都要对这三个信号
量进行p操作,因此在任何时刻只有一个线程的p操作都不会
被阻塞。
只需要三个信号量即可:
empty: 盘子空信号量
apple: 苹果信号量
orange: 橘子信号量
再构建4个线程:
分别是儿子线程,女儿线程,父亲线程, 母亲线程。

#include 
#include 
#include 
#include 
#include 

// 缓冲区容量
#define N 1
// 缓冲区中产品个数
int num = 0;

sem_t apple, orange, empty;

// 爸爸生产者线程
void* dad() {
    
        while(1)
        {
        sem_wait(&empty);	
        // 放入一个产品
        printf("dad  --> %d\n", num);
        num++;
        sem_post(&apple);
        sleep(rand() % 2); // 随机休眠一段时间
    	}
}

// 妈妈生产者线程
void* mon() {
   
        while(1)
        {
        sem_wait(&empty);
        // 放入一个产品
        printf("mon  --> %d\n",  num);
        num++;
        sem_post(&orange);
        sleep(rand() % 2); // 随机休眠一段时间
    	}
}

//儿子消费者线程
void* son() {
    
   
        while(1)
        { 
        sem_wait(&apple);
        // 取走一个产品
        printf("son  <-- %d\n",  num);
        num--;
        sem_post(&empty);
   	    sleep(rand() % 2); // 随机休眠一段时间
    	}
}

//女儿消费者线程
void* doughter() {
   
    while(1)
    {
       sem_wait(&orange);
       // 取走一个产品
       printf("doughter  <-- %d\n", num);
       num--;
       sem_post(&empty);
       sleep(rand() % 2); // 随机休眠一段时间
   	}
}

int main() {
	
    pthread_t dad1;
    pthread_t monther1;
    pthread_t son1;
    pthread_t doughter1;
   
	sem_init(&empty, 0, N);
    sem_init(&apple, 0, 0);
    sem_init(&orange,  0, 0);

	
    pthread_create(&dad1, NULL, dad, NULL);
    pthread_create(&monther1, NULL, mon, NULL);
	pthread_create(&son1, NULL, son, NULL);
	pthread_create(&doughter1, NULL, doughter, NULL);
   
    pthread_join(dad1, NULL);
    pthread_join(monther1, NULL);
    pthread_join(son1, NULL);
    pthread_join(doughter1, NULL);
	
    
}

运行结果:
操作系统多个生产者多个消费者问题_第1张图片

你可能感兴趣的:(linux学习)