美文网首页操作系统
生产者-消费者问题

生产者-消费者问题

作者: 大海孤了岛 | 来源:发表于2017-04-06 23:05 被阅读6次
问题描述
生产者-消费者
问题分析
  • 任何时刻只能有一个线程操作缓冲区(互斥访问)
  • 缓冲区为空时,消费者必须等待生产者(条件同步)
  • 缓冲区为满时,生产者必须等待消费者(条件同步)
用信号量描述每个约束
  • 二进制信号量mutex
  • 资源信号量fullBuffers
  • 资源信号量emptyBuffers
具体实现:
class BoundedBuffer{
    mutex = new Semaphore(1);
    fullBuffers = new Semaphore(0);
    emptyBuffers = new Semaphore(n);
}

BoundedBuffer::Deposit(c){
    //缓冲区空间减一
    emptyBuffers->P();
    //进入互斥访问
    mutex->P();
    Add c to the buffer;
    mutex->V();
    //离开临界区
    //生产资源加一
    fullBuffers->V();
}

BoundedBuffer::Remove(c){
    //生产资源减一
    fullBuffers->P();
    mutex->P();
    Remove c from buffer;
    mutex->V();
    //缓冲区空间加一
    emptyBuffers->V();
}
使用信号量的困难
  • 读/开发代码比较困难:程序员需要能运用信号量机制
  • 容易出错
    a. 使用的信号量已经被另一个线程占用
    b. 忘记释放信号量
使用管程实现:
class BoundedBuffer{
    Lock lock;
    int count = 0; //表示当前buffer的资源
    Condition notFull,notEmpty; //两个条件变量
}

BoundedBuffer::Deposit(c){
    lock->Acquire();
    //若缓存区满时,则放弃管程访问
    while(count == n){
        notFull.Wait(&lock);
    }
    Add c to the buffer;
    count ++;
    //唤醒等待的消费者
    notEmpty.Signal();
    lock->Release();
}

BoundedBuffer::Remove(c){
    lock->Acquire();
    //若生产资源为空时,放弃管程访问
    while(count == 0){
        notEmpty.Wait(&lock);
    }
    Remove c from buffer;
    count --;
    //唤醒等待的生产者
    notFull.Signal();
    lock->Release();
}

管程操作可以将PV操作放在一个模块中,可以简化PV操作。

相关文章

  • 生产者和消费者问题

    生产者和消费者问题 问题简述 组成 系统中有一组生产者和消费者进程 生产者生产者将产品放入缓冲区 消费者消费者进程...

  • 操作系统知识点持续更新

    生产者消费者问题 关于生产者消费者问题可以参考这篇文章:生产者消费者问题的java实现 临界区与互斥量 临界区:保...

  • 经典同步互斥问题

    生产者消费者问题 生产者消费者应当是最最基本的同步互斥问题了。生产者生产了之后消费者才消费,消费者消费之后,通知生...

  • 生产者和消费者问题详解

    生产者和消费者问题详解 定义 生产者消费者问题(英语:Producer-consumer problem),也称有...

  • 2-1.死锁-经典同步问题

    三、经典同步问题 1.生产者-消费者问题 计算机系统中的许多问题都可归结为生产者与消费者问题,生产者与消费者可以通...

  • 9. python多进程之Queue实现生产者消费者模型

    一、概述 什么是生产者消费者模式生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此...

  • 生产者消费者

    什么是生产者和消费者 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。 生产者和消费者彼此之间不直...

  • java生产者消费者实现

    什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直...

  • 生产者消费者模式-java原生、Disruptor实现方案

    生产者消费者模式介绍 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接...

  • Java实现生产者-消费者模型的几种方法

    什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直...

网友评论

    本文标题:生产者-消费者问题

    本文链接:https://www.haomeiwen.com/subject/hpaqattx.html