操作系统实训复习笔记(第7关:生产者消费者问题实践)

目录

第7关:生产者消费者问题实践

第1关:生产者消费者问题实践

1、在主线程中初始化锁为解锁状态

2、访问对象时的加锁操作与解锁操作

3、(生产和消费进程操作后)信号量操作实现进程同步

4、先等待(生产还是消费)需要的条件

5、生产者函数

6、消费者函数

第2关:进程互斥和同步

1、注意这以下4个的关系:

2、一般情况哪两个函数的参数一起配套使用

3、在第一次用完这些函数之后记得写上互斥锁,然后再调用这一类函数时之前要释放互斥锁。

4、儿子的消费进程

5、父亲的生产进程

6、女儿的消费进程


第7关:生产者消费者问题实践

第1关:生产者消费者问题实践

1、在主线程中初始化锁为解锁状态
  • pthread_mutex_t mutex;
  • pthread_mutex_init(&mutex, NULL);
2、访问对象时的加锁操作与解锁操作
  • 加锁 pthread_mutex_lock(&mutex);
  • 释放锁 pthread_mutex_unlock(&mutex);
3、(生产和消费进程操作后)信号量操作实现进程同步
  • 信号量加1操作:int sem_post(sem_t *sem);
  • 销毁信号量:int sem_destroy(sem_t *sem);
4、先等待(生产还是消费)需要的条件
  • sem_wait(&empty);
  • sem_wait(&full);

5、生产者函数
void *Producer()
{
    int nextp = 0;
    int i = 0;
	for(; i < 10; ++i)
	{  
		int time = rand() % 10 + 1;
        usleep(time*100000); 
        sem_wait(&empty);   //等待缓冲区有空位置,为空
		pthread_mutex_lock(&mutex);
		nextp = nextp + 1;
		buffer[in] = nextp;
		printf("Produce one message:%d\n", nextp);
		fflush(stdout);//printf后请一定调用这句刷新输出缓存
		in = (in + 1) % SIZE;
		pthread_mutex_unlock(&mutex);         //互斥锁解锁
		sem_post(&full);
	}
}
6、消费者函数

void *Consumer()
{
	//请补充消费者线程函数代码
    int nextc = 0;
    int i=0;
    for(;i<10;i++){
        sem_wait(&full);     //等待缓冲区有东西,不为空
        pthread_mutex_lock(&mutex); //加锁
        nextc= buffer[out];
        printf("Consume one message:%d\n", nextc);
        fflush(stdout);//printf后请一定调用这句刷新输出缓存
        out = (out + 1) % SIZE;
        pthread_mutex_unlock(&mutex);         //互斥锁解锁
        sem_post(&empty);
}

第2关:进程互斥和同步

(这个就比较简单的,仿照着写,读懂上一题就会写了)

1、注意这以下4个的关系:
  •  sem_wait(&empty); (意思是只要有空位置开始生产)
  • sem_post(&empty);(消费完就要提示空的位置+1)
  • sem_wait(&full);  (意思是只要有生产的东西开始消费)
  • sem_post(&full);(生产完就要提示已经生产的东西+1)
2、一般情况哪两个函数的参数一起配套使用
  • 在生产进程中:先判断是否有空位置(sem_wait(&empty);)最后在生产结束之后告诉生产的东西+1(sem_post(&full);)
  • 在消费的进程中:先判断是否有已经生产好的东西(sem_wait(&full);)最后在消费完之后提示空的位置+1(sem_post(&empty);)
3、在第一次用完这些函数之后记得写上互斥锁,然后再调用这一类函数时之前要释放互斥锁。
4、儿子的消费进程

(注意这里的消费的东西是:"&orange")

void *Son()
{
	//请添加儿子线程的函数代码
    while(1)
	{
		int time = rand() % 10 + 1;          //随机使程序睡眠0点几秒
		usleep(time * 100000);        
		sem_wait(&orange); 
		pthread_mutex_lock(&mutex);
		printf("儿子取了一个桔子\n") ;
        fflush(stdout);
		pthread_mutex_unlock(&mutex);         //互斥锁解锁
		sem_post(&empty);
	}
}
5、父亲的生产进程

(生产的是苹果:"&apple" 和 "&orange")

void *Dad()
{
	int nextp = 0;
	int i = 0;
    for(i = 0; i < 10; ++i)
	{
		int time = rand() % 10 + 1;          //随机使程序睡眠0点几秒
		usleep(time*100000);        
		sem_wait(&empty); 
		pthread_mutex_lock(&mutex);
		if(nextp == 0)
		{
			printf("爸爸放入了一个苹果\n");
		}
		else
		{
			printf("爸爸放入了一个桔子\n");
		}
        fflush(stdout);
		
		pthread_mutex_unlock(&mutex);         //互斥锁解锁
		
		if(nextp == 0)
		{
			sem_post(&apple);
		}
		else
		{
			sem_post(&orange);
		} 
		nextp = 1 - nextp; 
	}
}
6、女儿的消费进程

(注意这里的消费的东西是:"&apple")

void *Daughter()
{
	while(1)
	{
		int time = rand() % 10 + 1;          //随机使程序睡眠0点几秒
		usleep(time * 100000);        
		sem_wait(&apple); 
		pthread_mutex_lock(&mutex);
		printf("女儿取了一个苹果\n") ;
        fflush(stdout);
		pthread_mutex_unlock(&mutex);         //互斥锁解锁
		sem_post(&empty);
	}
}
  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁岁岁平安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值