生产者消费者模拟

生产者消费者模拟
一、实验任务
1、在WINDOWS 2000环境下,创建一个控制台进程,此进程包括2个线程:生产者线程和消费者线程。
2、用信号量机制解决进程(线程)的同步与互斥问题。
二、实验目的
1.掌握基本的同步互斥算法,理解生产者和消费者模型。
2.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。
3.学习使用Windows 2000/XP中基本的同步对象,掌握相应的API。
三、实验要求
1.生产者消费者对缓冲区进行互斥操作。
2.缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。
3.生产者消费者各循环操作10次。
四、设计思路和采取的方案
1.利用windows提供的API函数CreateSemaphore()创建信号量对象;CreateThread()创建线程;WaitForSingleObject()执行P操作;ReleaseSemaphore()执行V操作;WaitForMultipleObjects()主进程等待线程的结束等函数进行设计。
2.在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex) 。使用这些对象都分为三个步骤,一是创建或者初始化;接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在主进程中创建,在其子线程中都可
五、程序源代码及注释
#include <windows.h>
#include <stdio.h>
#include <iostream.h>

HANDLE empty_Semaphore;//设置信号量用。empty_Semaphore表示空的缓冲池的数量
HANDLE full_Semaphore;//用full_Semaphore表示满的缓冲池的数量
HANDLE mutex_Semaphore;//用mutex_Semaphore表示互斥信号量

void Producer(void )//创建生产者进程
{
        for (int i=1;i<10;i++)
        {
      WaitForSingleObject(empty_Semaphore,-1);
//对empty_Semaphore进行P操作
      WaitForSingleObject(mutex_Semaphore,-1);
//对mutex_Semaphore进行P操作
          
          printf("生产者%d准备生产 /n",i);
   printf("生产者%d开始往缓冲区中写数据... /n",i);
//生产者生产产品
   printf("生产者%d开始退出缓冲区... /n/n",i);

      ReleaseSemaphore(mutex_Semaphore,1,NULL);
//对mutex_Semaphore进行V操作
      ReleaseSemaphore(full_Semaphore,1,NULL);
//对full_Semaphore进行V操作
        }       
   return ;
}

void Consumer(void )//创建消费者进程
{
        for (int j=1;j<10;j++)
        {
       WaitForSingleObject(full_Semaphore,-1);
//对full_Semaphore进行P操作
       WaitForSingleObject(mutex_Semaphore,-1);
//对mutex_Semaphore进行P操作

       printf("消费者%d准备消费 /n",j);
           printf("消费者%d开始消费缓冲区中数据/n",j);//消费者消费产
       printf("消费者%d开始开始退出缓冲区... /n/n",j);

       ReleaseSemaphore(mutex_Semaphore,1,NULL);
//对mutex_Semaphore进行V操作
       ReleaseSemaphore(empty_Semaphore,1,NULL);
//对empty_Semaphore进行V操作
        }
  return;
}

void main ()
{
        HANDLE Data[2];//创建HANDLE数组Data
        empty_Semaphore=CreateSemaphore(NULL,10,10,NULL);//创建信号量empty_Semaphore
        full_Semaphore=CreateSemaphore(NULL,0,10,NULL);//创建信号量full_Semaphore
        mutex_Semaphore=CreateSemaphore(NULL,1,1,NULL);//创建互斥信号量mutex_Semaphore

        HANDLE handle[2];//创建HANDLE数组handle
        //以下是创建生产着和消费者进程
        handle[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Producer),&Data[0],0,NULL);
        if (handle[0]==NULL)
        {
                printf("创建生产者线程失败 /n");
        }
       
        handle[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consumer),&Data[1],0,NULL);
        if (handle[0]==NULL)
        {
                printf("创建消费者线程失败 /n");
        }
       
     WaitForMultipleObjects(2,handle,TRUE,-1);//主进程等待线程的结束
        return;
}


/**************************************************************/
#include "stdafx.h"
#define MAXNUM 12
HANDLE empty_Semaphore;//设置信号量用。empty_Semaphore表示空的缓冲池的数量
HANDLE full_Semaphore;//用full_Semaphore表示满的缓冲池的数量
HANDLE mutex_Semaphore;//用mutex_Semaphore表示互斥信号量

/*mutex_Semaphore控制的是流程,当A完成之后才进行B的操作,而不是A、B操作的数据*/
void Producer(void )//创建生产者进程
{
 for (static int i=1;i<MAXNUM;i++)
 {
  WaitForSingleObject(empty_Semaphore,-1);
  //对empty_Semaphore进行P操作
  WaitForSingleObject(mutex_Semaphore,-1);
  //对mutex_Semaphore进行P操作
  printf("生产者%d准备生产 /n",i);
  printf("生产者%d开始往缓冲区中写数据... /n",i);
  //生产者生产产品
  printf("生产者%d开始退出缓冲区... /n/n",i);
  ReleaseSemaphore(mutex_Semaphore,1,NULL);
  //对mutex_Semaphore进行V操作
  ReleaseSemaphore(full_Semaphore,1,NULL);
  //对full_Semaphore进行V操作
 }       
 return ;
}
void Consumer(void )//创建消费者进程
{
 //return;
 for (static int j=1;j<MAXNUM;j++)
 {
  WaitForSingleObject(full_Semaphore,-1);
  //对full_Semaphore进行P操作
  WaitForSingleObject(mutex_Semaphore,-1);
  //对mutex_Semaphore进行P操作
  printf("消费者%d准备消费 /n",j);
  printf("消费者%d开始消费缓冲区中数据/n",j);//消费者消费产
  printf("消费者%d开始开始退出缓冲区... /n/n",j);
  ReleaseSemaphore(mutex_Semaphore,1,NULL);
  //对mutex_Semaphore进行V操作
  ReleaseSemaphore(empty_Semaphore,1,NULL);
  //对empty_Semaphore进行V操作
 }
 return;
}
void main ()
{
 HANDLE Data[4];//创建HANDLE数组Data
 empty_Semaphore=CreateSemaphore(NULL,5,5,NULL);//创建信号量empty_Semaphore
 full_Semaphore=CreateSemaphore(NULL,0,5,NULL);//创建信号量full_Semaphore
 mutex_Semaphore=CreateSemaphore(NULL,1,1,NULL);//创建互斥信号量mutex_Semaphore
 HANDLE handle[4];//创建HANDLE数组handle
 //以下是创建生产着和消费者进程
 handle[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Producer),&Data[0],0,NULL);
 handle[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Producer),&Data[2],0,NULL);
 if (handle[0]==NULL||handle[2]==NULL)
 {
  printf("创建生产者线程失败 /n");
 }
 handle[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consumer),&Data[1],0,NULL);
 handle[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consumer),&Data[3],0,NULL);
 if (handle[0]==NULL||handle[3]==NULL)
 {
  printf("创建消费者线程失败 /n");
 }
 WaitForMultipleObjects(4,handle,TRUE,-1);//主进程等待线程的结束
 return;
}

**********************************************************************
用于实现多生产者,单消费者的同步问题
//新建信号量
hSemaphore =  CreateSemaphore(NULL,1,1,"MUSEX");//控制信号量
hStored = CreateSemaphore(NULL,0,100,"Stored");//读控制信号量
hEmpty = CreateSemaphore(NULL,100,100,"Empty");//写控制信号量

//读数据
readRecord()
{
  WaitForSingleObject( hStored,INFINITE);
  WaitForSingleObject(hSemaphore,INFINITE);
  //读操作
  ReleaseSemaphore(hSemaphore,1,NULL);
  ReleaseSemaphore( hEmpty,1,NULL);
}

//写数据
writeRecord()
{
  WaitForSingleObject( hEmpty,INFINITE);
  WaitForSingleObject(hSemaphore,INFINITE);
  //写数据操作
  ReleaseSemaphore(hSemaphore,1,NULL);
  ReleaseSemaphore( hStored,1,NULL);
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值