zoukankan      html  css  js  c++  java
  • 经典进程的同步问题之——生产者&&消费者

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

    假定在生产者和消费者之间的公用缓冲池,具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用。利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。只要缓冲区未满生产者便可将消息送入缓冲区,只要缓冲区未空消费者便可从缓冲区取走一个消息。

     1 Var mutex,empty,full:semapthore:=1,n,0; // 声明互斥信号量mutex=1,n个空缓冲区,满缓冲区个数为0
     2     buffer:array[0,1,...,n-1] of item;
     3     in,out:integer:=0,0; // 输入、输出指针
     4     begin
     5         parbegin
     6             proceducer:begin
     7                         repeat
     8                         ...
     9                         proceducer an item nextp; // 生产一个产品
    10                         ...
    11                         wait(empty);      // 申请一个空缓冲区
    12                         wait(mutex);      // 申请一个临界资源使用权
    13                         buffer(in):=nextp;// 将产品放入缓冲池中
    14                         in:=(in+1) mod n; // 输入指针向前移一个位置
    15                         signal(mutex);    // 释放临界资源
    16                         signal(full);     // 释放一个满缓冲区
    17                         until false;
    18                        end
    19             consumer:begin
    20                         repeat
    21                             wait(full);         // 申请一个满缓冲区
    22                             wait(mutex);        // 申请一个临界资源使用权
    23                             nextc:=buffer(out); // 从缓冲池取走一个产品
    24                             out:=(out+1) mod n; // 输出指针向前移一个位置
    25                             signal(mutex);      // 释放临界资源
    26                             signal(empty);      // 释放一个空缓冲区
    27                             consumer the item in nextc;
    28                         until false
    29                      end
    30         parend
    31     end

    2、利用AND信号量解决生产者——消费者问题(看懂了上面的详细分析,下面的伪代码就容易理解多了)

     1 Var mutex,empty,full:semapthore:=1,n,0;
     2     buffer:array[0,...,n-1] of item;
     3     in out:integer:=0,0;
     4 begin
     5     parbegin
     6         proceducer:begin
     7             repeat
     8              ...
     9              proceduce an item in nextp;
    10              ...
    11              Swait(empty,mutex);  // 同时申请一个空缓冲区和临界资源使用权
    12              buffer(in):=nextp;
    13              in:=(in+1)mod n;
    14              Ssignal(mutex,full); // 同时释放一个临界资源和满缓冲区
    15             until false
    16           end
    17         consumer:begin
    18             repeat
    19                 Swait(full,mutex);
    20                 Nextc:=buffer(out);
    21                 Out:=(out+1)mod n;
    22                 Ssignal(mutex,empty);
    23                 consumer the item in nextc;
    24               until false;
    25             end
    26     parend
    27 end
  • 相关阅读:
    使用原始XML资源——使用原始XML文件
    使用原始XML资源——定义原始XML资源
    属性动画(Property Animation)资源
    使用(Drawable)资源———AnimationDrawable资源
    使用(Drawable)资源———ClipDrawable资源
    RabbitMQ基本理论
    Celery分布式任务队列快速入门
    python多版本管理包pyenv
    CentOS6最佳实践
    BASH 基本语法
  • 原文地址:https://www.cnblogs.com/IamJiangXiaoKun/p/9466678.html
Copyright © 2011-2022 走看看