文章目录
- 生产者――消费者问题算法的实现
- 实验内容
- 1.问题描述:
- 2.功能要求:
- 背景知识
- 1.进程管理
- 2.信号量的有关知识
- 思路
- 核心代码
- 运行结果
- 结论
实验内容 1.问题描述:
- 一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池,只要缓冲池未空,消费者可从缓冲池取走一个消息。
- 根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等过程。
背景知识 1.进程管理
-
进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。同时,进程也是系统分配资源的最小单位。
-
资源 :内存、网络、硬盘
-
cpu : 多核cpu,把多个cpu打包捆绑在一起,安装在电脑,每个cpu核心都可以执行进程的代码
-
信号量机制是一种功能较强的机制,可用于解决互斥和同步的问题,它只能被两个标准的原语wait(S)和signal(S)访问,也可以记为“P操作”和“V操作”。
-
原语:指完成某种功能且不被分割,不被中断执行的操作序列,通常可由硬件来实现。例如TestAndSet和Swap指令就是通过硬件实现的原子操作。原语功能的不被中断执行特性在单处理机上可由屏蔽中断方法来实现。
- 假定在生产者和消费者之间的公用缓冲池中具有B个缓冲池,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥作用;利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将产品送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个产品。
核心代码
#include#include #include using namespace std; #define B 6 typedef int semaphore; //信号量是一种特殊的整型变量 semaphore full=0; // 记录缓冲区中满的槽数 semaphore buf[B]; // 有B个槽数的缓冲区buf[B],并实现循环缓冲队列 semaphore front=0, rear=0;//记录数据所在缓冲区的位置 semaphore mutex=1; // 互斥访问 semaphore empty=B; // 记录缓冲区中空的槽数,最多只能存在6个 void produce_item(int *item_ptr)//生产产品(用数据代替) { cout<<"生产一个产品:"; cin>>*item_ptr; } void enter_item(int x)//产品进入缓冲区 { buf[front]=x; cout<<"产品"< *x=(*x)-1; } void v(semaphore *y) // v操作 { *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< cout<<"消费者取出的产品为 "<< y< 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:消费者使用"< >a; if(a==1) { if(full cout<<"缓冲区已满,无法使用,请排队等候,请消费者取走消费n"; cout< if(empty cout<<"缓冲区已空,无法使用,请排队等候,请生产者先放产品到缓冲区n"; cout<
运行结果
结论
- 掌握P、V操作及其原理,理解系统如何调度线程,创建线程,初始化线程。
- 程序可能因阻塞问题而导致输出。理解了生产者与消费者问题模型,掌握解决该问题的算法思想。
- 掌握正确使用同步机制的方法。



