生产者消费者问题 C++实现
文章目录
- 生产者消费者问题 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
提供排他性非递归所有权语义:- 调用方线程从它成功调用
lock
或try_lock
开始,到它调用unlock
为止占有mutex
。 - 线程占有
mutex
时,所有其他线程若试图要求mutex
的所有权,则将阻塞(对于lock
的调用)或收到 false 返回值(对于try_lock
). - 调用方线程在调用
lock
或try_lock
前必须不占有mutex
。
- 调用方线程从它成功调用
成员函数
lock
- 锁定互斥, 若互斥不可用则堵塞
unlock
- 解锁互斥
unique_lock
介绍
定义于
声明
template< class Mutex > class unique_lock;
成员函数
- lock
- 锁定关联互斥
- unlock
- 解锁关联互斥
- mutex
- 返回指向关联互斥的指针
codition_variable
介绍
- 定义于头文件 <condition_variable>
- 声明
class condition_variable;
- 有意修改变量的线程必须:
- 获得std:: mutex(通过std::unique_lock)
- 在保有锁时进行修改
- 执行 notify_one 或 notify_all
- 任何有意在
std::condition_variable
上等待的线程必须- 获得
std::unique_lock <std::mutex>
- 执行 wait 、 wait_for 或 wait_until ,等待操作自动释放互斥,并悬挂线程的执行
- 线程被唤醒,且自动重获得互斥
- 获得
- **
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++实现相关推荐
- RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现
生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...
- 【C++】多线程(链式、循环队列)实现生产者消费者模式
生产者消费者模式: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...
- 面试官让我手写一个生产者消费者模式?
不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...
- windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现
生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...
- 基于队列的生产消费设计java_生产者-消费者设计模式
一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...
- 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来
题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...
- 生产者/消费者模型详解(基于Java)
title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...
- java线程模拟生产者消费者问题
所谓的生产者消费者问题,就是存在生产者和消费者两个线程,当仓库还没满的时候,生产者可以生产,当仓库没空的时候,消费者可以取走商品. 我们用实例说话: 下面,我们创建几个类: 1.消费者--主要负责消费 ...
- 图文并茂的生产者消费者应用实例demo
前面的几篇文章<<.NET 中的阻塞队列BlockingCollection的正确打开方式>><<项目开发中应用如何并发处理的一二事>>从代码以及理论角 ...
- linux使用线程实现生产者消费者问题,Linux平台下线程同步,实现“生产者消费者问题”...
(1)线程同步,实现"生产者消费者问题" 要求:缓冲区大小为20,生产者每次放一个产品,消费者每次取走一个产品:生产者和消费者至少2个. (2)代码如下: #include #in ...
最新文章
- tensorflow学习笔记(四十五):sess.run(tf.global_variables_initializer()) 做了什么?
- 【MATLAB】符号数学计算(七):符号微积分、符号微分方程求解、符号代数方程求解
- node读写本地文件
- Nacos源码HostReactor
- KOFLive Postmortem
- 【转】SharePoint 2010 Search Service -- 管理中心配置
- 北妈每日一学:ES6语法之 箭头函数(附免费学习资料)
- yii2在linux下面无法启用gii
- 张同学会是男版李子柒吗?
- Java之 final关键字
- Scala 学习总结
- python如何更新pip_[Python] 如何更新 PIP 到最新版本?
- python开发一个PC屏幕监控软件(2000块的道德底线)
- VS2015导出带文件的项目模板
- Linux下PDF转图片格式
- android api版本修改,Android 版seesmic修改API方法
- 基于MATLAB GUI界面的串口小助手
- 零钱通项目 - 韩老师
- 有关计算机的介绍英语,与计算机有关的英语(国外英文资料).doc
- javaH5女娲宫旅游网站设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署