生产者――消费者问题算法的实现
文章目录
- 生产者――消费者问题算法的实现
- 实验内容
-
- 背景知识
-
- 思路
- 核心代码
- 运行结果
- 结论
实验内容
1.问题描述:
- 一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池,只要缓冲池未空,消费者可从缓冲池取走一个消息。
2.功能要求:
- 根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等过程。
背景知识
1.进程管理
2.信号量的有关知识
思路
- 假定在生产者和消费者之间的公用缓冲池中具有B个缓冲池,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥作用;利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将产品送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个产品。
核心代码
#include <stdio.h>
#include <windows.h>
#include<iostream>
using namespace std;
#define B 6
typedef int semaphore;
semaphore full=0;
semaphore buf[B];
semaphore front=0, rear=0;
semaphore mutex=1;
semaphore empty=B;
void produce_item(int *item_ptr)
{
cout<<"生产一个产品:";
cin>>*item_ptr;
}
void enter_item(int x)
{
buf[front]=x;
cout<<"产品"<<buf[front] <<"被放到缓冲区 buf[";
cout<<front<<"]中"<<endl;
cout<<endl;
front=(front+1)%B;
}
void p(semaphore *x)
{
*x=(*x)-1;
}
void v(semaphore *y)
{
*y=(*y)+1;
}
void producer()
{
int item;
produce_item(&item);
p(&empty);
p(&mutex);
enter_item(item);
v(&mutex);
v(&full);
}
void remove_item(int *yy)
{
cout<<"从缓冲区 buf[";
cout<<rear<<"] 取走"<<buf[rear]<<endl;
*yy=buf[rear];
buf[rear]=0;
rear=(rear+1)%B;
}
void consume_item(int y)
{
cout<<"消费者取出的产品为 "<< y<<endl;
cout<<endl;
}
void consumer()
{
int get_item;
p(&full);
p(&mutex);
remove_item(&get_item);
v(&mutex);
v(&empty);
consume_item(get_item);
}
int main()
{
int a ;
while(1)
{
cout<<"1:生产者使用 2:消费者使用"<<endl;
cout<<"请输入1 or 2 "<<endl;
cin>>a;
if(a==1)
{
if(full<B)
producer();
else
{
cout<<"缓冲区已满,无法使用,请排队等候,请消费者取走消费\n";
cout<<endl;
}
}
else if(a==2)
{
if(empty<B)
consumer();
else
{
cout<<"缓冲区已空,无法使用,请排队等候,请生产者先放产品到缓冲区\n";
cout<<endl;
}
}
}
return 0;
}
运行结果
结论
- 掌握P、V操作及其原理,理解系统如何调度线程,创建线程,初始化线程。
- 程序可能因阻塞问题而导致输出。理解了生产者与消费者问题模型,掌握解决该问题的算法思想。
- 掌握正确使用同步机制的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)