首页 > 编程语言 >生产者消费者问题-C++代码实现

生产者消费者问题-C++代码实现

时间:2024-08-19 22:26:10浏览次数:8  
标签:std 生产者 ProduceAndConsumer 代码 C++ int guard lock include

生产者消费者问题C++代码

本文主要记录面试中手撕代码环节比较经常考察的生产者消费者问题,方便后续巩固和查看

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <functional>
using namespace std;

class ProduceAndConsumer {
public:
	ProduceAndConsumer() {
		producer = new std::thread(std::bind(&ProduceAndConsumer::produce, this));
		consumer = new std::thread(std::bind(&ProduceAndConsumer::consume, this));
	}
	~ProduceAndConsumer() {
		if (producer->joinable()) {
			producer->join();	// 线程阻塞,直至完成
		}
		if (consumer->joinable()) {
			consumer->join();	// 线程阻塞,直至完成
		}
		std::cout << "progress finish" << std::endl;
	}

	void produce() {
		int produce_count = 0;
		while (!isNotFinishProduce) {
			std::unique_lock<std::mutex> lock_guard(mu);
			while (q.size() >= q_max_size) {
				cond.wait(lock_guard);
			}
			int conduct = num++;
			q.push(conduct);
			produce_count++;
			std::cout << "product conduct, num = " << conduct << std::endl;
			if (produce_count > maxConductNum) {
				isNotFinishProduce = true;
			}
			lock_guard.unlock();
			cond.notify_all();
		}
	}

	void consume() {
		int consume_count = 0;
		while (!isNotFinishConsumer) {
			std::unique_lock<std::mutex> lock_guard(mu);
			while (q.empty()) {
				cond.wait(lock_guard);
			}
			int x = q.front();
			q.pop();
			std::cout << "consumer conduct: num = " << x << std::endl;
			consume_count++;
			if (consume_count > maxConductNum) {
				isNotFinishConsumer = true;
			}
			lock_guard.unlock();
			cond.notify_all();
		}
	}

private:
	std::thread* producer;
	std::thread* consumer;
	std::condition_variable cond;
	std::mutex mu;
	queue<int> q;
	int q_max_size = 100;
	bool isNotFinishProduce = false;
	bool isNotFinishConsumer = false;
	int maxConductNum = 1000;
	int num = 0;
};

int main() {
	ProduceAndConsumer* p = new ProduceAndConsumer();
	delete p;
	return 0;
}

标签:std,生产者,ProduceAndConsumer,代码,C++,int,guard,lock,include
From: https://www.cnblogs.com/xyfhsy/p/18368247

相关文章

  • 配置 昇腾 Ascend C/C++ 开发环境
    配置昇腾AscendC/C++开发环境flyfish这里以OrangePiAiPro为例先说如何配置MindStudio,然后再说如何查看OrangePiAiPro的一些信息OrangePiAIPro开发板是香橙派联合华为精心打造的高性能AI开发板,其搭载了昇腾AI处理器。Linux桌面系统的默认登录用户为H......
  • C++ 获取Linux 服务器CPU占用率+内存空闲率(亲测绝对可以运行)
    转自:C++获取Linux服务器CPU占用率+内存空闲率(亲测绝对可以运行)-远征i-博客园(cnblogs.com)代码来自网络,部分修改,亲测绝对可用C++:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<unistd.h>usingnamespacestd;type......
  • 牛客网习题——通过C++实现
    一、目标实现下面4道练习题增强C++代码能力。1.求1+2+3+...+n_牛客题霸_牛客网(nowcoder.com)2.计算日期到天数转换_牛客题霸_牛客网(nowcoder.com)3.日期差值_牛客题霸_牛客网(nowcoder.com)4.打印日期_牛客题霸_牛客网(nowcoder.com)二、对目标的实现 1.求1+2+3+......
  • C++图笔记(三)有向无环图(及最小生成树(略))以及剩下的排序
    目录一,定义:1,有向无环图 2,拓朴排序 1,每个顶点出现且仅仅出现一次。 2,若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B的前面。二,DAG的性质性质1.  从任意一个起点进行dfs,必不会陷入死循环。性质2.  入度为0的点信息确定,删掉入度为0的点......
  • C++--二叉搜索树
     目录 1.1二叉搜索树概念1.2二叉搜索树操作 1.2.1查找1.2.2插入1.2.3删除2.3二叉搜索树实现 2.4二叉搜索树的应用 2.5二叉搜索树的性能分析 1.1二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:--若它的左子......
  • yolov8双目测距(包含有前端的源码和无前端的源码Sgbm双目测距算法)-内含测距代码,视差图
    YOLOv8:YOLOv8是一个目标检测模型,它是YOLO(YouOnlyLookOnce)系列的一部分,用于实时物体检测。YOLOv8能够快速准确地检测视频或图像中的对象。双目测距:双目测距是指使用两个摄像头(或一个立体相机)从不同角度拍摄同一场景,通过比较两个摄像头捕捉到的图像差异来计算物体的距......
  • YOLOV5单目测距+车辆检测+车道线检测+行人检测(教程-代码)
     YOLOv5是一种高效的目标检测算法,结合其在单目测距、车辆检测、车道线检测和行人检测等领域的应用,可以实现多个重要任务的精确识别和定位。首先,YOLOv5可以用于单目测距。通过分析图像中的目标位置和尺寸信息,结合相机参数和几何关系,可以推断出目标与相机之间的距离。这对于......
  • C/C++语言基础--指针三大专题详解2(指针与数组关系,动态内存分配,代码均可)
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言指针是C/C++的灵魂,和内存地址相关联,运行的时候速度快,但是同时也有很多细节和规范要注意的,毕竟内存泄漏是很恐怖的指针打算分三篇文章进行讲解,本专题是二,介绍了指针和数组的关系、动态内存如何分配和释放等问题专题......
  • Eclipse下编写C++
    Eclipse下运行C++程序 文章目录Eclipse下运行C++程序装CDT插件测试运行C++程序附加说明众所周知Eclipse是常用于编写java的集成开发工具,但是像CodeBlocks和Dev-C++这类集成开发工具就只能编写C或C++的程序,极为不方便。写java的时候又得开......
  • 小白学习c++P7【1003】对齐输出(c++)详细讲解
     EXTRA##网站......