经典进程的同步问题之——生产者&&消费者

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

 

转载于:https://www.cnblogs.com/IamJiangXiaoKun/p/9466678.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值