1.目录结构

2.代码

BufferPool.h

#ifndef BUFFERPOOL
#define BUFFERPOOL
#include<windows.h>
#include<vector>
#include<iostream>
#include<string>
#define SIZE_OF_BUFFER 4
using namespace std;
//控制参数类
class BufferPool
{
public:static BufferPool * GetInstance();void Produce();void Consume();void Product_Sum();//多线程互斥信号量HANDLE mutex;HANDLE mutex2;//多线程同步信号量//空缓冲区HANDLE m_hSemaphoreBufferEmpty;//非空缓冲区HANDLE m_hSemaphoreBufferFull;unsigned int produce_sum;            //the total produce numberunsigned int consume_sum;            //the total consume numberprivate:unsigned short in;                   //the mark of position entering the space unsigned short out;                  //the mark of position leaving the spaceunsigned int Product_ID;unsigned int Consume_ID;static BufferPool *m_Instance;int buffer[SIZE_OF_BUFFER];          //缓冲池BufferPool(){int i = 0;in = out = 0;produce_sum = consume_sum = 0;Product_ID = Consume_ID = 0;for(;i < SIZE_OF_BUFFER; i++)buffer[i] = 0;};};
#endif

Consume.h

#ifndef CONSUME
#define CONSUME
#include "BufferPool.h"
#include<windows.h>
#include<vector>
#include<iostream>
#include<string>
class Consume
{
public:
Consume(){};
~Consume(){};
//消费产品
DWORD WINAPI ConsumeProduct(LPVOID lpParam);
};
#endif

Product.h

#ifndef PRODUCT
#define PRODUCT
#include "BufferPool.h"
#include<windows.h>
#include<vector>
#include<iostream>
#include<string>
class Product
{
public:
Product(){};
~Product(){};
//消费产品
DWORD WINAPI producer(LPVOID lpParam);
};
#endif

BufferPool.cpp

#include "BufferPool.h"//---------------------------------------------------------------------------//---------------------------------------------------------------------------
//unsigned short in, out;
//in = out = 0;
//获取单例实例
BufferPool * BufferPool::m_Instance = new BufferPool();BufferPool * BufferPool::GetInstance()
{
if(NULL == m_Instance)
{
m_Instance = new BufferPool();
}
return  m_Instance;
}void BufferPool::Produce()
{int i;std::cout<<"produce";//if(Product_ID>=10)// Product_ID=0;Product_ID++;produce_sum++;buffer[in]=Product_ID;printf(" buffer[%d]=%d    ",in,Product_ID);in=(in+1)%SIZE_OF_BUFFER;Product_Sum();
}void BufferPool::Consume()
{int i;std::cout<<"consume";consume_sum++;Consume_ID=buffer[out];printf(" buffer[%d]=%d    ",out,Consume_ID);buffer[out]=0;out=(out+1)%SIZE_OF_BUFFER;Product_Sum();
}void BufferPool::Product_Sum()
{int i,sum=0;for(i=0;i<SIZE_OF_BUFFER;i++){if(buffer[i]!=0)sum++;}
// std::cout<<"  "<<sum<<"         ";//for(i=0;i<SIZE_OF_BUFFER;i++)//{// std::cout<<buffer[i]<<" ";//}printf("   %d\n", sum);
}

consume.cpp

#include "Consume.h"
//---------------------------------------------------------------------------DWORD WINAPI Consume::ConsumeProduct(LPVOID lpParam)
{while (true){//等待非空的缓冲区出现,消费者进行消费,直到事件值为0WaitForSingleObject(BufferPool::GetInstance()->m_hSemaphoreBufferFull, INFINITE);WaitForSingleObject(BufferPool::GetInstance()->mutex2,INFINITE);                //the mutex P operationBufferPool::GetInstance()->Consume();Sleep(1000);ReleaseMutex(BufferPool::GetInstance()->mutex2);                                //resource semaphore P operationReleaseSemaphore(BufferPool::GetInstance()->m_hSemaphoreBufferEmpty,1,NULL);            //the mutex P operation}return 0;
}

Main_prg.cpp

#include<stdlib.h>
#include<windows.h>
#include "BufferPool.h"
#include "Product.h"
#include "Consume.h"typedef DWORD (WINAPI *pTheadFunc)(LPVOID lpParam);const unsigned short p_count=5;        //the number of produce one time
const unsigned short c_count=5;        //the number of consumer one time
const unsigned short s_count=p_count+c_count;  //the sum number of threads
bool control = true;
HANDLE threads[s_count];               //the handle of every thread
DWORD Producer_threadID[p_count];            //the mark of producer thread
DWORD Consumer_threadID[c_count];            //the mark of consumer threadvoid Create_P_Threads();
void Create_C_Threads();void Create_P_Threads()                                  //create producer thread
{for(int i=0;i<p_count;i++){DWORD (WINAPI Product::*pProductPoint)(LPVOID lpParam) = &Product::producer;int* ptemp= (int*)&pProductPoint;DWORD (WINAPI *pProductThread)(LPVOID lpParam) = *(pTheadFunc*)ptemp;//生产者线程threads[i]=CreateThread(NULL,0,pProductThread,NULL,0,&Producer_threadID[i]);if(threads[i]==NULL)control=false;}
}void Create_C_Threads()
{for(int i=p_count;i<s_count;i++){DWORD (WINAPI Consume::*pConsumePoint)(LPVOID lpParam) = &Consume::ConsumeProduct;int* ptemp= (int*)&pConsumePoint;DWORD (WINAPI *pConsumeThread)(LPVOID lpParam) = *(pTheadFunc*)ptemp;//消费者线程threads[i]=CreateThread(NULL,0,pConsumeThread,NULL,0,&Consumer_threadID[i-p_count]);if(threads[i]==NULL)control=false;}
}void info()
{std::cout<<"\n"<<std::endl;std::cout<<"produce/consume    used_total  buffer_state(from 0 to 9)"<<std::endl;
}int main()
{info();BufferPool::GetInstance()->mutex=CreateMutex(NULL,FALSE,NULL);BufferPool::GetInstance()->mutex2=CreateMutex(NULL,FALSE,NULL);BufferPool::GetInstance()->m_hSemaphoreBufferFull=CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);BufferPool::GetInstance()->m_hSemaphoreBufferEmpty=CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);Create_C_Threads();Create_P_Threads();while(control){if(getchar()){std::cout<<std::endl;std::cout<<"the total produce product number is "<<BufferPool::GetInstance()->produce_sum<<std::endl;std::cout<<"the total consume product number is "<<BufferPool::GetInstance()->consume_sum<<std::endl;break;}}return 0;
}

Product.cpp

#include "Product.h"
//---------------------------------------------------------------------------
DWORD WINAPI  Product::producer(LPVOID lpParam)
{while (true){//等待非空的缓冲区出现,消费者进行消费,直到信号量值为0WaitForSingleObject(BufferPool::GetInstance()->m_hSemaphoreBufferEmpty, INFINITE);WaitForSingleObject(BufferPool::GetInstance()->mutex,INFINITE);                //the mutex P operationBufferPool::GetInstance()->Produce();Sleep(1000);ReleaseMutex(BufferPool::GetInstance()->mutex);                                //resource semaphore P operationReleaseSemaphore(BufferPool::GetInstance()->m_hSemaphoreBufferFull,1,NULL);            //the mutex P operation}return 0;
}

运行效果

c++多线程生产者与消费者问题代码相关推荐

  1. Java多线程-生产者与消费者

    Java多线程生产者与消费者,准确说应该是"生产者-消费者-仓储"模型,使用了仓储,使得生产者消费者模型就显得更有说服力. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满 ...

  2. java多线程生产者与消费者问题_Java多线程详解之四:生产者消费者问题

    一.问题描述 生产者消费者问题(Producer-Consumer problem),也称有限缓冲区问题(Bounded-buffer promblem),是一个多线程同步问题的经典案例.对于一个固定 ...

  3. java多线程生产者与消费者案例_多线程操作实例——生产者与消费者

    面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者- ...

  4. Java基础进阶多线程-生产者和消费者模式

    1.什么是"生产者和消费者模式"? 生产线程负责生产,消费线程负责消费 生产线程和消费线程要达到均衡 这是一种特殊的业务需求,在这种特殊的情况下需要使用wait方法和notify方 ...

  5. java多线程生产者与消费者问题_java多线程实现生产者与消费者问题

    生产者与消费者多线程实现,首先的问题就是同步,就是关于临界资源的访问 我们首先来定义一个临界资源类,这里设为Q class Q { int z=4; } 这个int型的z就是我假设的临界资源的个数 然 ...

  6. 操作系统生产者与消费者问题代码实现

    问题分析: ①假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品.缓冲池被占用时,任何进程都不能访问. ② ...

  7. C++多线程-生产者与消费者模型

    生产者-消费者是很有意思的一种算法.它的存在主要是两个目的,第一就是满足生产者对资源的不断创造:第二就是满足消费者对资源的不断索取.当然,因为空间是有限的,所以资源既不能无限存储,也不能无限索取. 生 ...

  8. 多线程——生产者与消费者(多)1.5新锁,问题解决

    package 多线程;import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; imp ...

  9. Java 多线程-生产者、消费者

    一.整体代码 ThreadDemo.java public class ThreadDemo { public static void main(String[] args) { Godown god ...

最新文章

  1. ubuntu14.04上搭建android开发环境
  2. php 操作mssql,php操作mssql
  3. 科大星云诗社动态20210807
  4. Fiori应用全屏功能的实现 - fullscreen
  5. MATLAB 将不同长度的一维数组存入二维数组
  6. html里span和div,HTML div和span
  7. 电影票房数据查询服务高性能与高可用实践
  8. 极客唐小娟的故事-值得我们思考
  9. apriori关联规则
  10. linux命令提示符详解
  11. canvas教程15-变形
  12. python中清除文件内容用什么函数_数据清洗的基本流程_怎样清除excel中的公式
  13. 腾达f6虚拟服务器,腾达(Tenda)F6路由器无线wifi设置
  14. 基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验
  15. win7显示500服务器错误,搞定win10系统提示http500内部服务器错误的解决步骤
  16. 在数学建模中微型计算机,“在数学建模中培养学生思维能力的研究”课题研究情况汇报...
  17. Python自动覆盖录屏软件——NIRE工作室开源软件(参数自动校正)(欢迎白嫖)
  18. 一切都是最好的安排之hibernate00
  19. 教育期刊《中学历史教学参考》杂志简介及投稿须知
  20. 【My Electronic Notes系列——时序逻辑电路】

热门文章

  1. vscode html 换行设置
  2. Python教你每把轻松吃鸡
  3. Linux下for语句
  4. c语言编程给系统加密保护,C语言:模拟输入密码系统,三次以内正常通过,三次退出程序...
  5. 层叠轮播图、小程序3D轮播图、小程序轮播图、折叠轮播图、叠式轮播图、微信小程序叠式轮播图实现、小程序层叠轮播图swiper、Taro层叠轮播图、Taro叠式轮播图
  6. pythonb超分辨成像_深度原理与框架-图像超分辨重构-tensorlayer(示例代码)
  7. 数据库突然不能运行了,出现 no connection established这么办!
  8. 投影机拼接融合技术--介绍
  9. 用DirectX绘制使用纹理的立方体
  10. Linux 入门视频教程