我看的一下午才明白的,因为吧,我之前都是不知道与boost::thread相关的任何知识,然后开始看各种资料啊。。。

妈的,我就是一个小白,没一点基础的。。

总的来说:blocking_queue实现一个阻塞队列,它利用了生成者与消费者的设计模式,怎么说呢?、

首先吧,你要有一个queue(队列,c++里的一种容器),对它的操作有push与pop。 push即向队列里压入数据,相当于一个生产者,然后呢,pop把数据弹出队列,相当于一个消费者。。但是呢,生产者与消费者的速度可能不一样(即push与pop的速度)啊,那怎么办呢??所以呢,要想办法让它们同步啊,方法即把这样queue变为一个阻塞队列啊。。。

下面看一下怎么实现的:

它的构造函数 :

template<typename T>
BlockingQueue<T>::BlockingQueue()        : sync_(new sync()) {
}

在blockingqueue的头文件中包括:成员变量有:queue_(这是一个队列,类型为std::queue)

sync_(这是一个sync类,里面只有有两个成员变量:mutex_与condition_)

blockingqueue的成员函数:

void push(参数为一个要push进去的数据)

bool try_pop(参数为一个用于存放要pop出来的数据的指针),如果有数据可以pop出来,则返回true,否则为false

type pop(参数为一个用于存放要pop出来的数据的指针),它与上面的区别在于,如果queue为空时,它会等待。

bool try_peek(参数为一个用于存放队列最前端的数据的指针),它的作用就是试着返回一下queue最前端的数据;有数据写入,则true.

type peek(参数为一个用于存放队列最前端的数据的指针),与上面的区别在于没有数据,它会等待。

size_t size() ,它干的事情就是返回队列中数据的个数;

另外,对于blocking_queueg来说,它只会在pop与peek的时候进行相应的等待(如果队列为空就等啊),在push的时候不用等待的(应该队列不会满吧,它可以自动增加吧,应有可能取的速度较快吧,不会造成队列不断增加吧);

补充一下sync的类:

// 这个类是在BlockingQueue类中定义的
template<typename T>
class BlockingQueue<T>::sync {                                       public:                                                                   mutable boost::mutex mutex_;                                      boost::condition_variable condition_;
};

还是在这里写一下实现代码吧:

#include <boost/thread.hpp>
#include <string>#include "caffe/data_reader.hpp"
#include "caffe/layers/base_data_layer.hpp"
#include "caffe/parallel.hpp"
#include "caffe/util/blocking_queue.hpp"namespace caffe {template<typename T>
class BlockingQueue<T>::sync {public:mutable boost::mutex mutex_;             //实现了一个mutex对象;boost::condition_variable condition_;   //也是实现了一个对象;
};template<typename T>
BlockingQueue<T>::BlockingQueue()        : sync_(new sync()) {
}template<typename T>
void BlockingQueue<T>::push(const T& t) {// 在push操作过程中,创建一个scoped_lock的对象lock,利用它的构造函数来对// mutex_进行加锁;boost::mutex::scoped_lock lock(sync_->mutex_);  queue_.push(t);lock.unlock();   //对互斥体解锁;sync_->condition_.notify_one(); //给相应的wait中的线程发出通知;
}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;
}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);           //线程进入wait的过程;等相应的通知;
}T t = queue_.front();queue_.pop();return t;
}template<typename T>
bool BlockingQueue<T>::try_peek(T* t) {boost::mutex::scoped_lock lock(sync_->mutex_);if (queue_.empty()) {return false;}*t = queue_.front();return true;
}template<typename T>
T BlockingQueue<T>::peek() {boost::mutex::scoped_lock lock(sync_->mutex_);while (queue_.empty()) {sync_->condition_.wait(lock);}return queue_.front();
}template<typename T>
size_t BlockingQueue<T>::size() const {boost::mutex::scoped_lock lock(sync_->mutex_);return queue_.size();
}template class BlockingQueue<Batch<float>*>;
template class BlockingQueue<Batch<double>*>;
template class BlockingQueue<Datum*>;
template class BlockingQueue<shared_ptr<DataReader::QueuePair> >;
template class BlockingQueue<P2PSync<float>*>;
template class BlockingQueue<P2PSync<double>*>;}  // namespace caffe

转载于:https://www.cnblogs.com/yinheyi/p/5983115.html

caffe里的blocking_queue.hpp与.cpp干了点什么呢???相关推荐

  1. 改caffe 里面的contrsitve_loss

    昨天按照如何在caffe中增加layer以及caffe中triplet loss layer的实现 链接地址为:http://blog.csdn.net/tangwei2014/article/det ...

  2. Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?

    Stored Procedure 里的 WITH RECOMPILE 到底是干麻的? 原文:Stored Procedure 里的 WITH RECOMPILE 到底是干麻的? 在 SQL Serve ...

  3. caffe学习:通过研读classification.cpp了解如何使用caffe模型

    在学习caffe的过程中,安装caffe训练和测试手写字体识别例子成功时以为caffe不过如此:再用编译好的classification.bin分类小猫的图片时,发现自己能做的又非常的少.每次分类我都 ...

  4. 在新版本caffe里添加新的一层(向旧格式中加)

    今天实现了在caffe框架中加入一个层,完成欧式距离的任务.之所以这样,是因为还没有实现自己想要的loss,只是试着学者,看能不能把添加层的流程顺下来.最后实现了. (一)总体框架 1)在./src/ ...

  5. webpack里的loader是什么,干嘛的,webpack和loader是什么关系?

    1.首先,webpack干嘛的?看图: webpack就是打包的,就不啰嗦啦 2.那loader是什么玩意儿?在webpack的世界里,干了点什么? 先看看官网的解释,[https://www.web ...

  6. C盘里的文件夹都是干啥的

    主要是按照Win7中C盘文件夹详解哦~ 文章来源于百度搜索 https://jingyan.baidu.com/article/6fb756ec86720d241858fbad.html. 一.C盘根 ...

  7. StoredProcedure(存储过程) 里的 WITH RECOMPILE 到底是干麻的?

    WITH RECOMPILE 使用 CREATE PROCEDURE TestRecompile_WithRecompile (@p_parameter int )WITH RECOMPILE AS ...

  8. caffe编译报错 cudnn.hpp:127:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDe

    转载自: https://blog.csdn.net/u011070171/article/details/52292680 这是因为当前版本的caffe的cudnn实现与系统所安装的cudnn的版本 ...

  9. cpp和hpp的区别(转载)

    原文链接:https://blog.csdn.net/Qzx9059/article/details/89210571 c++中 cpp和hpp 我们可以将所有东西都放在一个.cpp文件内,编译器会将 ...

  10. 深度学习_21天实战Caffe.pdf

    深度学习_21天实战Caffe.pdf 原 深度学习21天实战caffe学习笔记<1:深度学习的过往> 1. 深度学习DL: 1.1.有监督学习.无监督学习.过拟合.训练样本.泛化.训练集 ...

最新文章

  1. Linux 受到开发者偏爱的 9 个理由!
  2. 匹兹堡计算机科学公司,2017美国匹兹堡大学计算机科学CS专业硕士录取
  3. 风影ASP.NET基础教学 5 验证控件(二) 扩展自己的验证控件
  4. java web的动静分离_Apache结合Tomcat实现动静分离的方法
  5. 设置好网络协议了为何网络还是不通_记一次菜鸟网络的面试经历
  6. Halcon 例程学习之频域自相关变换( correlation_fft)
  7. jmeter 加密解密_Android 数据加密软件简单评测(上)
  8. 服装网站建设策划书-服装网站建设目的需求分析策划书
  9. 你缺的不是一个“大牛” 而是一个透视宝
  10. 洛谷 P1007 独木桥
  11. word电子签名在线制作
  12. ubuntu NFS SCP SFTP
  13. 8255A的控制字和C口状态字
  14. 研发思维08----嵌入式智能产品数据服务后端分析
  15. 简单介绍pytorch中分布式训练DDP使用 (结合实例,快速入门)
  16. 如何用python自动改试卷_2019Python100道面试题,你会几道?
  17. 关于实现StarGen的思考记录
  18. Struts2【拦截器】就是这么简单
  19. 不错VB代码,收藏!!!
  20. RK3399平台开发系列讲解(PCI/PCI-E)5.55、PCIE RC枚举EP过程

热门文章

  1. 获取本机IP可区分系统可区分虚拟机和本机java程序跨平台
  2. 一个c++程序员对大学生的友情提醒
  3. 掌管大局的IoC Service Provider
  4. 各位,请慎用 subList!原来这么多坑!!
  5. 可能是最全的一份 2017 年中国移动互联网年度报告(建议收藏)
  6. Google深度学习TensorFlow最好的入门文章!
  7. 推荐一些不错的公众号【一】
  8. ios时间相差多少天_iOS 时间戳和时间互换,计算两日期相隔天数
  9. opengl在三维场景中绘制透明物体_WPF 3D绘图-三维建模技术井眼轨迹图实现(一)...
  10. canoe开发从入门到精通_后端java开发工程师学习路线