生产者――消费者问题算法的实现

 

一、实验内容

一个生产者和一个消费者共享一个缓冲区maxx

具体参数:生产者A

                  消费者B

                  缓冲区单元个数N=10。

根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等过程。

本程序用到如下信号量:

 Xian.lock—— 进程开始

   Xian.unlock —— 进程结束

   Hou.lock —— 输出

   Hou.unlock—— 输出完释放进程

二、背景知识

    如何实现两个进程共用一个临界资源,要用到信号量和锁。

三、思路

    用锁将两个进程隔开,让生产者和消费者同时享用一个缓冲区。

源程序

#include <iostream>

#include <mutex>

#include <thread>

/*

 * 1个生产者,1个消费者。

 */

using namespace std;

int com = 5;      

int maxx= 10;     // 存放产品的上限

mutex xian;       //定义一个锁让两个进程不冲突

mutex hou;        //定义一个解锁让第一个进程执行完第二个进程能继续执行

void producer(char name) {

int need = 0;

while (1) {

need = rand();

xian.lock();

if (com + need < maxx) {

com += need;

}

else {

need = maxx - com;

com = maxx;

}

hou.lock();

cout << name << "生产者生产了" << need << "件商品,货架上有" << com << "件货品\n";

if (com == maxx)cout << "货架已满\n";

hou.unlock();

xian.unlock();

std::this_thread::sleep_for(std::chrono::milliseconds(300));//设置延迟,不让他变得太快

}

}//生产者进程函数,让生产者生产产品

void consumer(char name) {

int need = 0;

while (1) {

need = rand();

xian.lock();

if (com - need > 0) {

com -= need;

}

else {

need = com;

com = 0;

}

hou.lock();

cout << name << "消费者消费了" << need << "件商品,货架上有" << com << "件货品\n";

if (com == 0)cout << "货架已空\n";

hou.unlock();

xian.unlock();

std::this_thread::sleep_for(std::chrono::milliseconds(300));//设置延迟,不让他变得太快

}

}//消费者进程函数,让消费者消费产品

int main() {

srand(time(NULL));

thread pa(&producer, 'A');//创建生产者线程

thread ca(&consumer, 'B');//创建消费者线程

pa.join();

ca.join();

return 0;

}

五、运行结果

    得到消费者和生产者消费的,生产的以及缓冲区实时的产品数。

六、结论

    消费者生产者问题需要使用信号量机制。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值