您的位置:首页 > 编程语言

多线程编程之PV操作示例代码

2016-05-31 17:33 295 查看
近期使用了下操作系统的PV操作实现了数据缓存功能的程序,记录下来供大家参考。

程序功能是生产者消费者模型,写数据线程产生数据,数据达到buffer上限时,通知消费者取数据,buffer的size可以动态设定 数据类型为double

生产者消费者模型 DataBuffer.hpp:

#include <iostream>
#include <mutex>
#include <condition_variable>
#include <vector>

class DataBuffer{
public:
DataBuffer(int size):size(size){}
~DataBuffer(){}
void produce(std::vector<double> dataset){
std::unique_lock<std::mutex> locker(m_mutex);
if (databuf.size() == size){
std::cout<<"DataBuffer wait for data buffer clear";
empty.wait(locker);
}
//produce start
databuf.push_back(dataset);
//produce end

if(databuf.size() == size){
full.notify_one();
}
}

void consume(std::vector<std::vector<double>> &output){
std::unique_lock<std::mutex> locker(m_mutex);
if (databuf.size() < size){
full.wait(locker);
}

//consume begin
output.insert(output.begin(), databuf.begin(), databuf.end());
databuf.clear();
//consume end

empty.notify_one();
}

void reset(){
std::unique_lock<std::mutex> locker(m_mutex);
databuf.clear();
}

private:
std::mutex m_mutex;
std::condition_variable empty, full;

const unsigned int size;
std::vector<std::vector<double>> databuf;
};


测试程序 DataBuffer.cpp:

#include "DataBuffer.hpp"
#include <thread>

int main(){
DataBuffer databuffer(8);
std::thread producer([&]()
{
std::vector<double> dataset;
dataset.push_back(1);
while(1){
std::this_thread::sleep_for (std::chrono::milliseconds (100));
databuffer.produce(dataset);
std::cout<<"producer Thread+++"<<std::endl;
}
});

std::thread consumer([&]()
{
std::vector<std::vector<double>> output;
while(1){
databuffer.consume(output);
std::cout<<"consumer Thread-----"<<std::endl;
}
});

producer.join();
consumer.join();
std::cout<<"Main Thread"<<std::endl;

return 0;
}


运行效果:

pv# g++ -std=c++11 DataBuffer.cpp -o DataBuffer.out -lpthread

pv# ./DataBuffer.out

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

consumer Thread-----

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

producer Thread+++

consumer Thread-----

producer Thread+++
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 生产者消费者 pv