关于生产者和消费者的分析可以参考:
http://blog.csdn.net/kenden23/article/details/16340673
这里是利用C++简单模拟一个生产者消费者的工作模式。没有考虑到同步问题。
操作了一个队列,用BUFFER_SIZE控制了队列的大小,也根据需要可以不用控制大小。感觉数据结构无处不在。
使用单一设计模式实现缓冲区。
执行类代码:
#ifndef PRODUCERCONSUMER_H
#define PRODUCERCONSUMER_H
#include<string>
#include<queue>
using std::string;
using std::queue;
class Buffer
{
//不能用const,需要加上static,否则vs无法编译
const static int BUFFER_SIZE = 10;
queue<string> bMemory;
static Buffer *singleBuffer;
//若这里定义了构造函数,就算是空,也必须要到.cpp文件定义。要么都不写。单一模式一定要写
Buffer();
public:
//这里的static最容易忘记,一定要记得。
//非静态成员引用一定要与特定对象相对,否则编译错误。
static Buffer *getBuffer();
string top() const
{
return bMemory.front();
}
string buttom() const
{
return bMemory.back();
}
int size() const
{
return bMemory.size();
}
bool empty()
{
return bMemory.empty();
}
bool full()
{
return bMemory.size() == BUFFER_SIZE;
}
bool push(string &str)
{
if(!full())
{
bMemory.push(str);
return true;
}
return false;
}
bool getAndPop(string &str)
{
if(!empty())
{
str = bMemory.front();
bMemory.pop();
return true;
}
return false;
}
~Buffer()
{
if(singleBuffer)
delete singleBuffer;
}
};
//===============================================================
class ProducerConsumer
{
public:
ProducerConsumer();
//~ProducerConsumer();
void produce(string prostr);
void consume(string &constr);
void wait();
void whatInPool();
private:
Buffer *shaderdMemory;
};
#endif
头文件:
#include<iostream>
#include"ProducerConsumer.h"
using namespace std;
//注意:类里面的static成员不过是声明,如果没有定义的话,那么就无法使用的,在cpp里面才能定义,就是分配内存空间。
Buffer *Buffer::singleBuffer = nullptr;
//这个函数需要使用singleBuffer,如果没有上面的定义的话,就会出现错误:无法解析的外部符号
//原因就是singleBuffer还没有定义,当然是无法使用这个符号。
Buffer *Buffer::getBuffer()
{
if(!singleBuffer)
{
singleBuffer = new Buffer();
}
return singleBuffer;
}
Buffer::Buffer()
{
}
ProducerConsumer::ProducerConsumer()
{
shaderdMemory = Buffer::getBuffer();
}
void ProducerConsumer::produce(string prostr)
{
//如果没有下面的函数定义,那么下面的wait()也是无法使用的,无法解析外部符号。
//也是因为有声明没有定义的缘故。类里面的函数也是相当于声明。所以必须定义了之后才能使用。
if(!shaderdMemory->push(prostr))
{
wait();
return;
}
cout<<"Good! We have produced one item.\n";
}
void ProducerConsumer::consume(string &constr)
{
if(!shaderdMemory->getAndPop(constr))
{
wait();
return;
}
cout<<"Very well! you just consume "<<constr<<" successfully\n";
}
void ProducerConsumer::wait()
{
cout<<"The Buffer is full, or you comsume too much.\n"
<<"You need to produce some or comsume some first and come back try again.\n";
}
void ProducerConsumer::whatInPool()
{
string temp;
cout<<"We have "<<shaderdMemory->size()<<" in our pool.\n";
for (int i = 0; i < shaderdMemory->size(); i++)
{
if(!shaderdMemory->getAndPop(temp))
{
cerr<<"Empty\n";
return;
}
cout<<temp<<"\n";
shaderdMemory->push(temp);
}
cout<<endl;
}
测试主程序:
#include<iostream>
#include<vector>
#include<algorithm>
#include"ProducerConsumer.h"
using namespace std;
int main()
{
string item;
ProducerConsumer prodcons;
char ch;
cout<<"Produce or Consume or Leave?(p or c or l)"<<endl;
ch = getchar();
while (ch != 'l')
{
switch (ch)
{
case 'p':
cout<<"What do you want to produce? Name it, we will make it for you!"<<endl;
//如果是用cin那么空格之后的字符就不能读入,getline可以读入任意多的字符
//注意:清楚数据流中的\n回车字符
while (getchar() != '\n');
getline(cin, item);
prodcons.produce(item);
cout<<"Produce or Consume or Leave?(p or c or l)"<<endl;
ch = getchar();
break;
case 'c':
cout<<"Welcome, consumer!"<<endl;
prodcons.consume(item);
cout<<"Produce or Consume or Leave?(p or c or l)"<<endl;
while (getchar() != '\n');
ch = getchar();
break;
default:
cout<<"Produce or Consume or Leave?(p or c or l)"<<endl;
while (getchar() != '\n');
ch = getchar();
break;
}
}
cout<<"See what we have produced in pool\n";
prodcons.whatInPool();
system("pause");
return 0;
}
最终运行结构:
分享到:
相关推荐
生产者 消费者 模式 c++ 算是老外写的一个使用demo 可以参考一下
计算机操作系统经典的生产者消费者问题c++高级语言的实现。编程入门必备。
利用C++实现的生产消费者模式,每个生产者和消费者都在不同的线程中异步执行。
linux下C++实现生产者和消费者问题,并及时输出缓存区的状态,方便理解。代码中有详细的注释,方便阅读。
生产者消费者经典问题,这个程序选择用c++实现。希望我们能够分享。。。。。
使用Qt 和 C++11 的std::mutex 和 std::condition_variable 实现一个演示生产者消费者模式的Qt工程。
操作系统中典型的同步问题,m个生产者,n个消费者链接在具有k个单位缓冲区的有界环形缓冲区上,生产者和消费者是并发线程,只要缓冲区未满,生产者线程就可以生产一件产品放入其中,只要缓冲区不空,消费者就可以...
用多进程同步方法解决生产者—消费者问题(c++源码) 1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。 2、生产者和消费者各有两个以上。 3...
用Posix信号量, Posix互斥量, 解决生产者消费者问题(c++版)
C++实现生产与消费者模型,利用锁实现互斥。
用进程同步方法解决“生产者-消费者”问题,C或C++语言实现。 1、设计目的 通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。 2、设计要求 1)每个生产者和消费者对有界缓冲区进行操作后,即时显示...
多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多...
经典的生产者消费者问题,用c++实现,比较适合学生参考
在很多网站上都没找到,所以自己做了个发出来,希望大家给出意见
C++ 多线程通信方式简介并结合生产者-消费者模式代码实现
操作系统中,生产者消费者程序C++版, 1、实验环境 本实验是在win2000+VC6.0环境下实现的,利用Windows SDK编制实例程序。所以试验需要在windows下安装VC后进行。VC是一个集成开发环境,其中包含了Windows SDK所有...
C++ windows版 多生产者多消费者的队列实现
操作系统 生产者消费者问题 C++MFC实现
通过实验模拟生产者与消费者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。 实验要求: 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程类型标号、进程...