进程同步实验(生产者与消费者问题算法实现)

本文介绍了一个通过WinAPI实现的生产者消费者问题的进程同步实验,使用互斥量和信号量解决缓冲池的满与空问题。程序包含生产者线程和消费者线程,当缓冲池满或空时,线程会根据信号量进行等待或唤醒。通过调整生产者和消费者数量,观察不同场景下的同步效果。
摘要由CSDN通过智能技术生成

1. 实验目标和要求

进程的同步是操作系统处理机管理的重要内容,本实验要求学生理解生产者与消费者问题模型,掌握解决该问题的算法思想,学会使用同步机制。

2. 实验内容

一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。

缓冲区1

P

Q

缓冲区2

缓冲区3

缓冲区n-1

缓冲区n

放消息

N个缓冲区

取消息

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

 

 

3. 实验方法或步骤

3. 1  程序类图

3. 2  采用的同步方法

 

1.利用函数CreateMutex(NULL,FALSE,NULL)创建互斥信号量g_hMutex,表示缓冲区当前的状态,若为true时,则表示缓冲区正被别的进程使用。三个参数表示的意义分别为:指向安全属性的指针,初始化互斥对象的所有者,指向互斥对象名的指针,

2.利用函数 CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL)创建缓冲区满的信号量g_hFullSemaphore,值为true时表示缓冲区已满。四个参数分别为:表示是否允许继承、设置信号机的初始计数、设置信号机的最大计数、指定信号机对象的名称(-1是因为计数从开始)

3.利用函数CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)创建缓冲区空的信号量g_hEmptySemaphore,该值为true时表示缓冲区为空。

3. 3  数据定义及其详细解释

const   unsigned   short   SIZE_OF_BUFFER   =   15;   //缓冲区长度 

  unsigned   short   ProductID   =   0;         //产品号 

  unsigned   short   ConsumeID   =   0;         //将被消耗的产品号 

  unsigned   short   in   =   0;             //产品进缓冲区时的缓冲区下标 

  unsigned   short   out   =   0;             //产品出缓冲区时的缓冲区下标 

  int   g_buffer[SIZE_OF_BUFFER];         //缓冲区是个循环队列 

  bool   g_continue   =   true;             //使程序跳出循环,控制程序结束 

  HANDLE   g_hMutex;               //用于线程间的互斥 

  HANDLE   g_hFullSemaphore;           //当缓冲区满时迫使生产者等待 

  HANDLE   g_hEmptySemaphore;           //当缓冲区空时迫使消费者等待

  DWORD   WINAPI   Producer(LPVOID);         //生产者线程 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值