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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

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