生产者和消费者问题

生产者与消费者问题


*概念

有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,是即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品.

*解决方法

  1. 利用记录型信号量解决生产者-消费者问题

    先来看一段伪代码(信号量机制原理)

    Var mutex,empty,full:semaphore:=1,n,0;  // 定义三个信号量
    buffer:array[0,...,n-1]of item;  // 定义缓冲池,容量为n
    in,out:integer:=0,0;
    begin
        parbegin
            proceducer:begin // 生产者
                    repeat
                    .
                    .
                    .
                    producer an item nextp; // 生产一个产品
                    .
                    .
                    .
                    wait(empty);   // 申请一个空缓冲区
                    wait(mutex);  // 申请缓冲池的使用权
                    buffer(in):=nextp; // 将产品放入缓冲池中
                    in:=(in+1)mod n;  // 下一个空缓冲区地址
                    signal(mutex);  //释放缓冲池使用权
                    signal(full);  // 释放一个满缓冲区
                    until false;
                end
            consumer:begin
                    repeat
                    wait(full); //申请一个满缓冲区
                    wait(mutex); // 申请缓冲池的使用权
                    nextc:=buffer(out); //从缓冲池中取出产品
                    out:=(out+1)mod n; //下一个满缓冲区的地址
                    signal(mutex); //释放缓冲池使用权
                    signal(empty); //释放一个空缓冲区
                    consumer the item in nextc; //消费一个产品
                    until false;
                end
        parend
    end
    

nextp 应该是next proceducer的意思
nextc 应该是next consumer的意思.

  • 貌似也不是什么变量,属于语言描述而已

至于生产者进程如何被阻塞和唤醒,因为程序中有一个 repeat语句,所以进程不断测试缓冲池是否有空缓冲区,以及缓冲池是否有其他进程使用。若两个条件不满足,则进入阻塞队列等待。若某一时刻两个条件都能满足,则能唤醒该进程。

code

未完成

  1. 利用AND信号量解决生产者和消费者问题

    @@@@
    
  2. 利用管程解决生产者和消费者问题

    @@@@
    

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