文章目录

  • 生产者消费者问题 C++实现
    • 知识准备
      • thread
        • 介绍
        • 成员类
        • 成员函数
      • sleep_for
        • 介绍
      • mutex
        • 介绍
        • 成员函数
      • unique_lock
        • 介绍
        • 成员函数
      • codition_variable
        • 介绍
        • 成员函数
    • 代码示例

生产者消费者问题 C++实现

知识准备

thread

介绍

  • 定位于头文件的class thread
  • 表示单个执行线程, 没有两个thread对象会表示同一个线程
    • 不可复制构造
    • 不可复制赋值

成员类

  • id

成员函数

  • get_id

    • 返回线程的id
  • hardware_concurrency

    • 返回实现支持的并发线程数
  • join

    • 等待线程完成其执行

sleep_for

介绍

  • 定义域头文件

  • 声明

    • template< class Rep, class Period >
      void sleep_for( const std::chrono::duration<Rep, Period>& sleep_duration );
      
    • sleep_duration : 要睡眠的时长

mutex

介绍

  • 定义于头文件

  • mutex 提供排他性非递归所有权语义:

    • 调用方线程从它成功调用 locktry_lock 开始,到它调用 unlock 为止占有 mutex
    • 线程占有 mutex 时,所有其他线程若试图要求 mutex 的所有权,则将阻塞(对于 lock 的调用)或收到 false 返回值(对于 try_lock ).
    • 调用方线程在调用 locktry_lock 前必须不占有 mutex

成员函数

  • lock

    • 锁定互斥, 若互斥不可用则堵塞
  • unlock

    • 解锁互斥

unique_lock

介绍

  • 定义于

  • 声明

    template< class Mutex >
    class unique_lock;
    

成员函数

  • lock

    • 锁定关联互斥
  • unlock
    • 解锁关联互斥
  • mutex
    • 返回指向关联互斥的指针

codition_variable

介绍

  • 定义于头文件 <condition_variable>
  • 声明class condition_variable;
  • 有意修改变量的线程必须:
      1. 获得std:: mutex(通过std::unique_lock)
      2. 在保有锁时进行修改
      3. 执行 notify_one 或 notify_all
  • 任何有意在 std::condition_variable 上等待的线程必须
      1. 获得std::unique_lock <std::mutex>
      2. 执行 wait 、 wait_for 或 wait_until ,等待操作自动释放互斥,并悬挂线程的执行
      3. 线程被唤醒,且自动重获得互斥
  • **std::condition_variable只可与 std::unique_lock<std::mutex>一同使用;

成员函数

  • notify_one

    • 通知一个等待线程
  • notify_all

    • 通知所有等待线程
  • wait

    • 阻塞当前进程, 直至被唤醒
  • wait_for

    • 阻塞当前线程,直到条件变量被唤醒,或到指定时限时长后
    • wait_until
      • 阻塞当前线程,直到条件变量被唤醒,或直到抵达指定时间点
        

代码示例

// operator_system.cpp: 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<iostream>
#include <mutex>
#include <condition_variable>
#include <windows.h>
#include <thread>using namespace std;static const int buffer_size = 10; // 缓存大小
static const int item_total = 100; //总共要生产 item_total个item// 缓存结构体, 使用循环队列当做缓存
struct Buffer
{int buffer[buffer_size];size_t read_position; // 当前读位置size_t write_position; // 当前写位置mutex mtx; // 读写互斥//条件变量condition_variable not_full; condition_variable not_empty;
}buffer_res;typedef struct Buffer Buffer;void porduce_item(Buffer *b, int item)
{unique_lock<mutex> lock(b->mtx);//设置互斥锁while(((b->write_position + 1) % buffer_size) == b->read_position) {//当前缓存已经满了cout << "buffer is full now, producer is wating....." << endl;(b->not_full).wait(lock); // 等待缓存非full}// 向缓存中添加item(b->buffer)[b->write_position] = item;(b->write_position)++;// 若到达最后一个, 写位置置位0if (b->write_position == buffer_size)b->write_position = 0;(b->not_empty).notify_all();lock.unlock();
}int consume_item(Buffer *b)
{int data;unique_lock <mutex> lock(b->mtx);while (b->write_position == b->read_position){  // 当前buffer 为空cout << "buffer is empty , consumer is waiting....." << endl;(b->not_empty).wait(lock);}data = (b->buffer)[b->read_position];(b->read_position)++;if (b->read_position >= buffer_size)b->read_position = 0;(b->not_full).notify_all();lock.unlock();return data;
}//生产者任务
void producer() {for (int i = 1; i<= item_total;i++) {cout << "prodece the " << i << "^th item ..." << endl;porduce_item(&buffer_res, i);}
}//消费者任务
void consumer()
{static int cnt = 0;while(1) {Sleep(1);int item = consume_item(&buffer_res);cout << "consume the " << item << "^th item" << endl;if (++cnt == item_total)break;}
}//初始化 buffer
void init_buffer(Buffer *b)
{b->write_position = 0;b->read_position = 0;
}int main()
{init_buffer(&buffer_res);thread prodece(producer);thread consume(consumer);prodece.join();consume.join();getchar();
}

查看其他精彩文章
深入分析HashMap
AOP核心原理和SpringAOP
10分钟入门SpringAOP

生产者消费者问题 C++实现相关推荐

  1. RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现

    生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...

  2. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

  3. 面试官让我手写一个生产者消费者模式?

    不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...

  4. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现

    生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...

  5. 基于队列的生产消费设计java_生产者-消费者设计模式

    一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...

  6. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

  7. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

  8. java线程模拟生产者消费者问题

    所谓的生产者消费者问题,就是存在生产者和消费者两个线程,当仓库还没满的时候,生产者可以生产,当仓库没空的时候,消费者可以取走商品. 我们用实例说话: 下面,我们创建几个类: 1.消费者--主要负责消费 ...

  9. 图文并茂的生产者消费者应用实例demo

    前面的几篇文章<<.NET 中的阻塞队列BlockingCollection的正确打开方式>><<项目开发中应用如何并发处理的一二事>>从代码以及理论角 ...

  10. linux使用线程实现生产者消费者问题,Linux平台下线程同步,实现“生产者消费者问题”...

    (1)线程同步,实现"生产者消费者问题" 要求:缓冲区大小为20,生产者每次放一个产品,消费者每次取走一个产品:生产者和消费者至少2个. (2)代码如下: #include #in ...

最新文章

  1. tensorflow学习笔记(四十五):sess.run(tf.global_variables_initializer()) 做了什么?
  2. 【MATLAB】符号数学计算(七):符号微积分、符号微分方程求解、符号代数方程求解
  3. node读写本地文件
  4. Nacos源码HostReactor
  5. KOFLive Postmortem
  6. 【转】SharePoint 2010 Search Service -- 管理中心配置
  7. 北妈每日一学:ES6语法之 箭头函数(附免费学习资料)
  8. yii2在linux下面无法启用gii
  9. 张同学会是男版李子柒吗?
  10. Java之 final关键字
  11. Scala 学习总结
  12. python如何更新pip_[Python] 如何更新 PIP 到最新版本?
  13. python开发一个PC屏幕监控软件(2000块的道德底线)
  14. VS2015导出带文件的项目模板
  15. Linux下PDF转图片格式
  16. android api版本修改,Android 版seesmic修改API方法
  17. 基于MATLAB GUI界面的串口小助手
  18. 零钱通项目 - 韩老师
  19. 有关计算机的介绍英语,与计算机有关的英语(国外英文资料).doc
  20. javaH5女娲宫旅游网站设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. 关于sleep和wait
  2. Ubuntu下更新软件 updata,upgrade
  3. [转] 宝宝头三年影响一生,不看悔掉肠子
  4. Python蹒跚学步0:关于Winpython的安装
  5. url pattern中/与/*的区别
  6. 首届“智慧岱岳,共创未来”高层次人才创新创业大赛等你来
  7. 车牌识别系统完整商用级别设计流程
  8. 落幕在即的科技巨头苹果,厄运才刚刚开始?
  9. 马一篇帖子,关于reactingFoam与high-speed flow
  10. 【Docker技术入门与实战】存出和载入镜像