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中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]