肇庆学院计算机学院
实 验 报 告
专业网络工程 班级 10 网工 1 班 姓名 学号课程名称计算机操作系统
学年 2011 --2012 学期 1□ / 2□
实验名称:实验四 生产者――消费者问题算法的实现(选做)
课程类别 专业必修□ 限选□ 任选□ 实践□
实验内容:
实验时间:2012 年 5 月 9 日
1.问题描述:一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消
费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池,
只要缓冲池未空,消费者可从缓冲池取走一个消息。
2.功能要求:根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等
过程。
C
实验目的及要求:
一、目的
1.了解信号量的使用。
2.加深对信号量机制的理解。
二.要求
1.理解生产者与消费者问题模型,掌握解决该问题的算法思想。
2.掌握正确使用同步机制的方法。
实验内容、方法与步骤:(使用附页填写并附在本页后)
实验结果:(使用附页填写并附在本页后)
小结:
本次课程设是关于生产者与消费者之间互斥和同步的问题。问题的实质是 P、V 操作,实验设一个共享缓
冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放
缓冲区为止。生产者与消费者是一个与现实有关的经典问题,与“和尚挑水”问题的原理相同,通过此原
理举一反三可以解决其他类似的问题。
过本课程设计,我们对操作系统的 p、v 进一步的认识,深入的了解 p、v 操作的实质和其重要性。课本的
理论知识进一步阐述了现实中的实际问题。
分数:
批阅老师:
2012 年 月 日
- 1 -
肇庆学院计算机学院
实验报告(附页)
实验内容、方法与步骤:
实验方法与步骤:
1.生产者功能描述:
在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中
供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费
者线程释放出一个空缓冲区。
2.消费者功能描述:
消费者线程从缓冲区中获得物品,然后释放缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,
那么消费者线程将被阻塞,直到新的物品被生产出来。
3. 程序结构图:
4. 数据结构分析
(1)生产者与消费者实现:
这其中主要是通过多线程,来实现生产者和消费者之间的协调问题。
(2)生产者(producer)——消费者(consumer):
通过一些记录性变量,来记录模拟实现生产者的行为,通过输入语句的提示
程序采用 OO 设计模式,缓存区采用数组结构存储。
5. 生产者与消费者问题算法的实现代码
#include
#include
const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度
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);
DWORD WINAPI Consumer(LPVOID);
int main()
{
//产品进缓冲区时的缓冲区下标
//产品出缓冲区时的缓冲区下标
//缓冲区是个循环队列
//产品号
//将被消耗的产品号
//当缓冲区满时迫使生产者等待
//当缓冲区空时迫使消费者等待
//控制程序结束
//用于线程间的互斥
//生产者线程
//消费者线程
- 2 -
//创建各个互斥信号
g_hMutex = CreateMutex(NULL,FALSE,NULL);
g_hFullSemaphore
=
CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);
g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
//调整下面的数值,可以发现,当生产者个数多于消费者个数时,
//生产速度快,生产者经常等待消费者;反之,消费者经常等待
const unsigned short PRODUCERS_COUNT = 3;
const unsigned short CONSUMERS_COUNT = 1;
//总的线程数
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
HANDLE hThreads[PRODUCERS_COUNT]; //各线程的 handle
DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符
DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符
//创建生产者线程
for (int i=0;i
for (int i=0;i
WaitForSingleObject(g_hEmptySemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
Take();
Consume();
Sleep(1500);
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hFullSemaphore,1,NULL);
}
return 0;
}
实验结果:
1.一个消费者三个生产者:
2.三个生产者三个消费者:
- 5 -
3.三个消费者一个生产者:
4.三个生产者四个消费者
- 6 -
分数:
批阅老师:
200 年 月 日
- 7 -
- 8 -