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

原创 2016年05月31日 17:33:24

近期使用了下操作系统的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+++



版权声明:本文为博主原创文章,未经博主允许不得转载。

用PV操作实现多线程间同步互斥(PV)

关于PV操作在计算机操作系统中,PV操作是进程管理中的难点。首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:    P(S):①...
  • Mycro
  • Mycro
  • 2005年12月05日 16:30
  • 8904

多线程信号量PV操作初探

直接上源码吧: 在主线程中创建一个信号量mutex(注意参数,当前值和最大值都设为1),开启总计PRODUCER_COUNT份producer线程,不停地对该信号量mutex进行PV操作;再开启CO...
  • fm0517
  • fm0517
  • 2013年08月28日 14:31
  • 910

PV操作,我终于懂你了!

上个星期,米老师给我们讲课实在是精彩!本人终于对Pv操作有了自己的理解。之前一直不太理解Pv操作,现在总结一下,以供下阶段学习和总结。 为什么叫PV操作?原因是:这是狄克斯特拉用荷兰文定义的,因为在...
  • u010843114
  • u010843114
  • 2015年04月07日 21:42
  • 1128

【操作系统】——PV操作

大家都说操作系统中的PV操作部分看不懂,确实我在专业课中学习这门课时,PV操作被列为书中的重点和难点,就是因为它不好理解。当时自己听完课也是一头雾水,到期末考试结束,也没弄明白这是怎么一回事,更没有意...
  • u013045214
  • u013045214
  • 2015年04月05日 18:49
  • 6326

PV操作--经典问题分析

为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点。本文将会先简要介绍下PV操作的来源和基本使用方法,然后再通过两道经典的计算机考研真题—...
  • y824448940
  • y824448940
  • 2016年11月09日 16:36
  • 2133

原语以及PV操作

原语通常由若干条指令组成,用来实现某个特定的操作。通过一段不可分割的或不可中断的程序实现其功能。原语是操作系统的核心,它不是由进程而是由一组程序模块所组成,是操作系统的一个组成部分,它必须在管态(一种...
  • m243723424
  • m243723424
  • 2014年05月13日 10:55
  • 766

操作系统(三)——PV操作的简单理解

PV操作的简单理解 一、什么是PV操作       在操作系统中,进程是一个很要花时间理解的东西,进程通常分为就绪、运行和阻 塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:...
  • u013067756
  • u013067756
  • 2015年03月03日 11:47
  • 2457

信号灯集实现PV操作

信号灯(semphore)也叫信号量,它是不同进程间或者一个给定的进程内不同线程同步机制 信号灯: 1.二值信号灯:信号为0、1与互斥锁类似,资源勇士为1,不用时为0 2.计数信号灯:值到0-n...
  • xiaopangzi313
  • xiaopangzi313
  • 2013年06月22日 18:23
  • 891

【软考】PV操作同步互斥

PV操作的思想、重在思想——chenchen
  • u010191034
  • u010191034
  • 2014年10月10日 01:19
  • 1811

PV操作--题目解析 (赞)

感觉概念理解的差不多了,试着做一两道题,来看看是否真的明白,以及还有什么地方不明白的.   下面都是软考真题,之前看它的时候,我是一点也不会,只巴望着我软考的时候不要考啊.现在我看看有没有一点点思...
  • jindao909
  • jindao909
  • 2016年02月29日 21:29
  • 841
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程编程之PV操作示例代码
举报原因:
原因补充:

(最多只允许输入30个字)