首页 > 编程语言 >C++生产者消费者模型

C++生产者消费者模型

时间:2024-06-01 14:55:07浏览次数:21  
标签:std count return 生产者 lock 模型 value queue C++

这里模拟了一个队列,5个消费者线程和5个生产者线程来共同使用队列里面的数据处理。包括了阻塞和非阻塞的出队入队方法。注意在添加线程时使用到了std::ref引用,在传参给线程时不能直接传入queue的引用,要使用std::ref才是真正意义上的引用,当直接使用queue编译器是不会通过的,因为其实直接传入queue只是对当前的队列的引用的拷贝,不是其本身。而std::ref才是真正引用其本身。

include
include <condition_variable>
include
include
using namespace std;
template<typename T,size_t capacity>
class SyncQueue {
public:
SyncQueue():count(0){}

void Eequeue(T value){
	std::unique_lock<std::mutex> lock(m);
	not_full.wait(lock, [this]() {return count != capacity; });
	syncQueue.push_back(value);
	++count;
	lock.unlock();
	not_empty.notify_one();
}
bool TryEequeue(T value) {
	std::lock_guard<std::mutex> lock(m);
	if (count == capacity) return false;
	syncQueue.push(value);
	++count;
	not_empty.notify_one();
	return true;
}
T Dequeue() {
	std::unique_lock<std::mutex> lock(m);
	not_empty.wait(lock, [this]() {return count !=0; });
	T value = syncQueue.front();
	syncQueue.pop();
	--count;
	lock.unlock();
	not_full.notify_one();
	return value;
}
bool TryDequeue(T &value) {
	std::lock_guard<std::mutex> lock(m);
	if (count == 0) return false;
	value = syncQueue.front();
	syncQueue.pop();
	--count;
	not_full.notify_one();
	return true;
}
size_t getCurrentSize() {
	std::lock_guard<std::mutex> lock(m);
	return count;
}

private:
std::mutex m;
std::condition_variable not_full;
std::condition_variable not_empty;
std::queue syncQueue;
size_t count;
};

void producer(SyncQueue<int, 10>& queue, int ThreadID) {
int value;
for (int i = 0; i < 10; i++) {
value = ThreadID * 100 + i;
if (queue.TryEequeue(value)) {
cout << "TryEnqueue success value = " << value << endl;
}
else {
cout << "TryEnqueue faild value = " << value << endl;
i--;
}

}

}
void consumer(SyncQueue<int, 10>& queue, int ThreadID) {
int value;
while (queue.TryDequeue(value)) {
cout << "TryDequeue success : " << value << endl;
}
}
int main() {
SyncQueue<int, 10> queue;
std::vectorstd::thread producers;
std::vectorstd::thread consumers;
for (int i = 0; i < 5; i++) {
producers.emplace_back(std::thread(producer,std::ref(queue),i));
}
for (int i = 0; i < 5; i++) {
consumers.emplace_back(std::thread(consumer, std::ref(queue), i));
}
for (auto &thread: producers) {
thread.join();
}
for (auto& thread : consumers) {
thread.join();
}
return 0;
}

标签:std,count,return,生产者,lock,模型,value,queue,C++
From: https://www.cnblogs.com/chhblogs/p/18225983

相关文章

  • C++:最小公倍数与最大公约数
    最大公约数(GreatestCommonDivisor,GCD)最小公倍数(LeastCommonMultiple,LCM)#include<iostream>//函数:计算两个数的最大公约数(GCD),这被称为欧几里得算法intgcd(inta,intb){if(b==0)returna;returngcd(b,a%b);}//函数:计算两个数的......
  • 1-006 连续因子(分数 20,c++)
    一个正整数 N 的因子中可能存在若干连续的数字。例如630可以分解为3×5×6×7,其中5、6、7就是3个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。输入格式:输入在一行中给出一个正整数 N(1<N<231)。输出格式:首先在第1......
  • 【C++进阶】深入STL之string:掌握高效字符串处理的关键
    ......
  • C++ 智能指针学习笔记
    1、为什么使用智能指针?    一句话就是为了防止内存泄漏。voidremodel(std::string&str){std::string*ps=newstd::string(str)...str=ps;return;}    举个例子,如上面代码,每当调用时,该函数都分配堆内的内存,但从不收回,从而导致......
  • 【计算机毕业设计】谷物识别系统Python+人工智能深度学习+TensorFlow+卷积算法网络模
    谷物识别系统,本系统使用Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对11种谷物图片数据集('大米','小米','燕麦','玉米渣','红豆','绿豆','花生仁','荞麦','黄豆','黑米','黑豆')进行训练......
  • 记一次读取halcon二维码模型文件的报错
    C#中使用的halcon的dll版本为17.12二维码模型是通过halcon软件保存的,halcon软件版本为20.05.前后使用的halcon版本不一致,导致程序中读取模型一直报错“HALCONerror#8860:Invalidheaderin2ddatacodemodelfileinoperatorread_data_code_2d_model”  ChatG......
  • C++常用STL容器
    备注:文中图片来自hackingcpp.vectorvector是C++中最常用的容器,它可以动态改变自身大小。dequelist(双向链表)forward_list(单向链表)unordered_setsetunordered_mapmap......
  • c++ 集合类 CCSet简单实现
      代码如下:  /**CCSet.h*c++_common_codes**Createdbyxichenon12-1-21.*Copyright2012cc_team.Allrightsreserved.**/#ifndefCC_SET_H#defineCC_SET_H#include"ccVector.h"#include<iostream>//CCSettemplate&l......
  • 【华为OD】D卷真题200分:篮球比赛 C++代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客 JS、C、C++、Java、python代码实现:【华为OD】D卷真题200分:篮球比赛JavaScript代码实现[思路+代码]-CSD......
  • C++基础编程部分知识总结应用--图书管理系统
    C++基础编程部分知识总结应用–图书管理系统文章目录C++基础编程部分知识总结应用--图书管理系统1.代码结构和预处理命令2.定义图书结构体3.定义图书列表结构体4.后台控制函数5.显示主菜单6.添加图书函数7.查询图书函数8.显示所有图书函数9.修改图书信息函数10......