文档介绍:实验一生产者和消费者问题
1、实验目的要求
1)、通过编写程序,掌握基本的同步互斥算法,理解生产者和消费者模型。
2)、了解多线程并发执行机制,线程间的同步和互斥。
3)、学****使用同步对象,掌握相应的API。
2、实验主要内容
编写基础的生产者消费者程序,程序反映了生产者和消费者的工作过程,其中缓冲区只存放一类产品,生产者消费者只对一类产品进行操作。
1)创建生产者和消费者线程
2)生产和消费规则
a)系统中有多个生产者,生产者每次只生产一种产品;
b)系统中有多个消费者,消费者每次可以消费一个产品。
c)生产者与消费者共享一个具有n个缓冲区的缓冲池。
d)生产者与消费者互斥使用缓冲池,即某一时刻只允许一个生产者或消费者使用缓冲池。
e)不允许消费者进程到一个空缓冲池去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的缓冲池中投放产品。
f)缓冲池不要求是循环环形缓冲区,也不要求一定是顺序访问,生产者可以将产品投放入任意的空缓冲区。
3、实验仪器设备
PC兼容机。
4、程序流程图
(1)、生产者流程图
开始
是否有空缓冲区
缓冲池是否上锁
对缓冲池上锁
模拟生产
添加产品
缓冲池解锁
结束
阻塞
否
是
是
否
(2)、消费者流程图
开始
是否有满缓冲区
缓冲池是否上锁
对缓冲池上锁
取走产品
模拟消费
缓冲池解锁
结束
阻塞
否
是
是
否
5、源代码
#include <>
#include <>
const unsigned short n = 10;
unsigned short ProductID = 0;
unsigned short ConsumeID = 0;
unsigned short in = 0;
unsigned short out = 0;
int buffer[n];
bool g_continue = true;
HANDLE Mutex;
HANDLE Full;
HANDLE Empty;
void Produce()
{
buffer[in] = ++ProductID;
printf("生产者生产产品%d中...\n",ProductID);
Sleep(2000);
printf("在缓冲区%d添加一个产品\n",in);
in = (in+1)%n;
}
void Consume()
{
ConsumeID = buffer[out];
printf("消费者消费产品%d...\n",ConsumeID);
Sleep(2000);
printf("从缓冲区%d拿走一个产品\n",out);
out = (out+1)%n;
}
DWORD WINAPI Producer(LPVOID lpPara)
{
while(g_continue){
if(WaitForSingleObject(Empty,2000)==WAIT_TIMEOUT)
{
printf("producer empty time out!\n");
continue;
}