OS2021-生产者消费者问题

本文详细介绍了生产者消费者问题的背景及解决方案,重点讨论了有界缓冲区和无界缓冲区的实现策略。通过互斥信号量和条件变量,确保了生产者和消费者对缓冲区的正确访问。同时,文章强调了避免死锁的重要性,提供了具体的C语言实现示例,展示了如何在多线程环境中协调生产者和消费者的资源操作。
摘要由CSDN通过智能技术生成

生产者消费者问题

  • 释放资源的是生产者,使用资源的是消费者。资源可以是软件也可以是硬件的。

  • 如果资源是数据,有以下几个角色,承担对应的职责:

    • 生产者:生产数据放到缓冲区
    • 缓冲区
      • 任何时候只有一个主体访问
      • 满时无法放数据,空时无法取数据。
    • 消费者:从缓冲区取走数据
  • 缓冲区可以分为:

    • 有界缓冲区

      • 互斥操作+ 同步关系
    • 无界缓冲区

      • i指第一个空闲位置, j指第一个存数据位置.

      • i、j的更新不需要考虑空、满的情况,因为信号量empty、full已经进行了保证。

      • 要确保一旦申请到了mutex,必须能够正常执行。不然占着mutex会导致死锁。

      • semaphore mutex; mutext.value= 1 //互斥访问信号量
        semaphore empty; empty.value= n; //空资源信号量, 放数据用
        semaphore full; full.value= 0 //有数据信号量, 取数据用
        
        int i, j
        ITEM Buffer[n]
        ITEM data_p, data_c
        
        
        //三个信号量,分别确保有空位、互斥、有数据。
        void producer(){
        	while(true){
                produce an item in data_p
                wait(empty) //确保有空闲位置
                wait(mutex) //进入临界区
                Buffer[i]= data_p
                i=  (i+1)%n //更新空闲位置
                signal(mutex) //离开临界区
                signal(full) //声明放了数据
                }
        }
        
        void consumer(){
        	while(true){
        		wait(full) //确保有数据
        		wait(mutex) //进入临界区
        		data_c= Buffer[j]
        		j= (j+1)%n
        		signal(mutex) //退出临界区
                signal(empty) //声明有空位
        	
        	}
        
        
        }
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值