首页 > 其他分享 >多线程之手撕生产者-消费者

多线程之手撕生产者-消费者

时间:2024-09-23 22:34:59浏览次数:9  
标签:capacity 之手 ulock 生产者 int que 多线程 cv pool

要点

  • 维护一个资源(在生产者-消费者中即流水线的位置)池,实现put()/get()两个函数。由于对信号量的操作是互斥的,要引入条件变量和信号量。
  • 实现资源池类Pool,成员变量:
    • mtx : mutex
    • cv : condition_variable
    • que : queue
    • capacity : int
  • 实现资源池类Pool,成员函数:
    • T get() : 获取一个队列头的资源
    • void put(T val) : 放置一个资源到队列末尾

代码实现

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

  template<typename T>
  class Pool {
  private:
  	int capacity;
  	mutex mtx;
  	condition_variable cv;
  	queue<T> que;
  public:
  	Pool(int _capacity) : capacity(_capacity) {}

  	void put(T val) {
  		unique_lock<mutex> ulock(mtx);
  		while (que.size() >= capacity) {
  			cv.wait(ulock);
  		}
  		que.push(val);
  		cv.notify_all();
  		cout << "生产了 " << val << endl;
  		return;
  	}

  	T get() {
  		unique_lock<mutex> ulock(mtx);
  		while (que.empty()) {
  			cv.wait(ulock);
  		}
  		T ans = que.front();
  		que.pop();
  		cv.notify_all();
  		cout << "消费了 " << ans << endl;
  		return ans;
  	}
  };

  int main() {
  	cout << "开始程序------" << endl;
  	Pool<int> pool(3);

  	thread t1([&pool]() {
  		for (int i = 0; i < 10; ++i) {
  			pool.put(i);
  			this_thread::sleep_for(chrono::milliseconds(100));
  		}
  		return;
  	});

  	thread t2([&pool]() {
  		for (int i = 0, ans = 0; i < 10; ++i) {
  			int res = pool.get();
  			this_thread::sleep_for(chrono::milliseconds(200));
  		}
  		return;
  	});

  	t1.join();
  	t2.join();
  	return 0;
  }

标签:capacity,之手,ulock,生产者,int,que,多线程,cv,pool
From: https://www.cnblogs.com/GaogaoBlog/p/18428065

相关文章

  • JAVA多线程
    一、并发和并行    并发:同一时刻,多个指令在单个CPU上交替执行。    并行:同一时刻,多个指令在多个CPU上同时执行。二、多线程的实现方式1.继承Thread类的方式进行实现。publicclassThreadDemo{publicstaticvoidmain(String[]args){MyT......
  • 多线程问题:异常处理,单例
    1)多线程异常处理多线程中如何捕获抛出异常到主线程a)catch中使用std::current_exception();获得正在处理的异常b)通过引用类型std::exception_ptr&_ex_ptr传出c)std::rethrow_exception(ex_ptr);重新抛出异常usingnamespacestd; try{ std::exception_ptrex_ptr;......
  • Vant之手机端上传图片只允许拍照上传
    1.开发拍照上传页面-andImgCapture.vue<template><div><van-buttonicon="plus"type="primary":disabled="disabled"@click.stop="clickCamera">拍照上传</van-button><divclass="carma-co......
  • 面试:多线程顺序打印
            在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。比如说:使用join方法,T3调用T2,T2调用T1,这样就能确保T1就会先完成而T3最后完成。        定义三个类,分别实现Runnable接......
  • c++多线程,锁
    1)机器最大线程数uint16_tmax_thread=thread::hardware_concurrency();2)vector中管理线程获取线程ida)thread::id_id=std::this_thread::get_id();b)threadth(getSum_vector,ref(arr),ref(_sum));cout<<th.get_id();容器中存储线程变量:使用emplace_back原位构造a......
  • 智能指针之手撕共享指针shared_ptr
    要点成员是指向实例的指针和应用计数应用计数也应该是一个共享的int指针,因为这个计数需要各个共享指针同步维护需要重载的函数有:用指针构造;拷贝构造;赋值运算符=;解地址运算符*;指针调用成员的运算符->;析构函数;涉及到计数的部分:构造时初始化:1拷贝构造:+1赋值=:原有-1,新对象+1......
  • 如何在自动化测试中应用装饰器、多线程优化自动化架构?
    1、装饰器概念        装饰器是Python中用于修改函数或类的语法结构的工具。它以函数作为输入参数,并返回一个函数作为一个输出函数,在不改变原有函数的代码情况下,给函数增加功能或改变函数行为。        装饰器的使用方式是在函数定义的上方使用@decorator_n......
  • 线程的概念与多线程模型
    目录线程的概念线程的属性多线程模型一对多模型​编辑​编辑​编辑多对一模型多对多模型​编辑​编辑线程的概念首先先了解有线程和没线程的区别没线程的进程:进程间虽可以相互切换并发执行,但每个进程内的程序不能相互切换并发执行。就比如你可以一边听音乐一遍聊微......
  • 【多线程面试题】涵盖三个常见的场景
    1.多线程轮流打印数字最简单的代码题,使用两种加锁方式,sychronized和ReentranLocksychronizedpublicclassMain{privatestaticfinalObjectlock=newObject();privatestaticintnum=100;privatestaticintcnt=0;publicstaticvoidm......
  • Java多线程大全
    文章目录简介多线程使用场景后台任务:多线程的基本概念Java程序是如何运行的?线程的创建和启动1、线程的创建和启动1.1、继承Thread类1.2、实现Runnable接口2、线程的调度与控制2.1、线程优先级2.2、Thread.sleep3、Thread中几个方法、......