CAFFE源码学习笔记之八-阻塞队列blocking_queue

2023-12-19 18:58

本文主要是介绍CAFFE源码学习笔记之八-阻塞队列blocking_queue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言
我的理解是在CAFFE中,数据的产生即从存储系统中读取出来和数据的消耗即被读入数据层进行计算必然是异步的,也就是生产者和消费者模型。所以才有了双阻塞队列来实现数据在数据层与存储系统之间的同步。

为什么使用队列?
因为图像数据只需要按照固定的顺序一步一步输入即可,不存在随机访问,不存在随机写入,同时queue底层是由链式表构成的,其访问速度不会随着元素的增加而增加。

如何实现多线程下的阻塞?
使用互斥锁和条件变量。

双阻塞队列将在预取层中梳理。

二、源码分析
1、成员变量
说明该类是对STL的queue的封装。

  std::queue<T> queue_;shared_ptr<sync> sync_;

2、互斥锁和条件变量

template<typename T>
class BlockingQueue<T>::sync {public:mutable boost::mutex mutex_;#互斥锁boost::condition_variable condition_; #条件变量
};

互斥锁的使用:
boost::mutex::scoped_lock提供局部锁定的功能,类似与智能指针,在离开作用域时立即解锁。

template<typename T>
bool BlockingQueue<T>::try_pop(T* t) {boost::mutex::scoped_lock lock(sync_->mutex_);if (queue_.empty()) {return false;}*t = queue_.front();queue_.pop();return true;
}

条件变量的使用:
当队列已经空了之后:
sync_->condition_.wait(lock)表示使用当前mutex标记,交出了CPU的控制权

template<typename T>
T BlockingQueue<T>::pop(const string& log_on_wait) {boost::mutex::scoped_lock lock(sync_->mutex_);while (queue_.empty()) {if (!log_on_wait.empty()) {LOG_EVERY_N(INFO, 1000)<< log_on_wait;}sync_->condition_.wait(lock);}T t = queue_.front();queue_.pop();return t;
}

push操作将t压入队列,sync_->condition_.notify_one()激活了上面的线程的CPU控制权,继续pop操作。

template<typename T>
void BlockingQueue<T>::push(const T& t) {boost::mutex::scoped_lock lock(sync_->mutex_);queue_.push(t);lock.unlock();sync_->condition_.notify_one();
}

三、总结
在STL的queue的基础上,加上互斥锁和条件变量实现了多线程下的阻塞队列。

这篇关于CAFFE源码学习笔记之八-阻塞队列blocking_queue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/513339

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen