(Caffe)基本类InternalThread(三)

转载 2016年06月01日 19:21:17

本文地址:http://blog.csdn.net/mounty_fsc/article/details/51088262

1 简介

类InternalThread是一个虚类,是Caffe中的多线程接口,其本质为封装了boost::thread。

2 继承关系

这里写图片描述

说明:

  • 可见,Caffe中使用多线程的地方主要是从磁盘读取数据的地方。

3 源代码

<code class="language-c++ hljs java has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
 * Virtual class encapsulate boost::thread for use in base class
 * The child class will acquire the ability to run a single thread,
 * by reimplementing the virtual function InternalThreadEntry.
 */</span>
class InternalThread {
 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>:
  <span class="hljs-title" style="box-sizing: border-box;">InternalThread</span>() : <span class="hljs-title" style="box-sizing: border-box;">thread_</span>() {}
  virtual ~InternalThread();

  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> StartInternalThread();
...

 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">protected</span>:
  /* Implement <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span> method in your subclass
      with the code you want your thread to run. */
  virtual <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">InternalThreadEntry</span>() {}

 ...
 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span>:
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">entry</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> device, Caffe::Brew mode, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> rand_seed, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> solver_count,
      bool root_solver);

  shared_ptr<boost::thread> thread_;
};

}  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// namespace caffe</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>

说明:

  1. 每个派生类都需要实现一个InternalThreadEntry()但为什么不设计成纯虚函数,而是设计成一个未实现的虚函数呢?
  2. thread_的初值为NULL,所以单单继承InternalThread不会产生新的线程
  3. 但是调用InternalThread::StartInternalThread() 函数,则会执行以下代码,重置thread_,该线程绑定的函数是InternalThread::entry()

    thread_.reset(new boost::thread(&InternalThread::entry, this, device, mode,
    rand_seed, solver_count, root_solver));
    
  4. InternalThread::entry()中,调用了InternalThread::InternalThreadEntry(),该函数在不同的派生类中的实现是不同的(即不同的子线程完成的任务不一样)

[1].http://caffe.berkeleyvision.org/doxygen/classcaffe_1_1InternalThread.html

深度学习Caffe框架入门视频课程

深度学习框架caffe入门,详解网络配置中每一个层的结构和参数项,对于超参数配置文件详解每一个参数的含义以及选择策略。对于数据源实例演示了两种最常用的数据源LMDB和HDF5格式。课程涉及许多caffe框架的小技巧如绘制网络图和loss曲线,自定义python层等。希望大家通过学习可以熟练使用caffe去训练网络完成各自的任务。
  • 2016年12月23日 18:13

梳理caffe代码internal_thread(九)

经过common的学习之后,然后这个InternalThread类实际上就是boost库的thread的封装,然后对线程进行控制和使用。废话不多啰嗦 看看头文件: class InternalTh...
  • langb2014
  • langb2014
  • 2016-03-28 18:15:20
  • 2181

caffe InternalThread类学习

InternalThreadInternalThread 这个类是使用与DataLayer里面的。InternalThread使用的是boost库的thread(基本的使用方法找一下其他博客)。cla...
  • u012235274
  • u012235274
  • 2016-07-13 10:25:12
  • 512

CAFFE源码学习笔记之五-internal_thread

一、前言 该类实际是boost::thread的包裹器。boost十分强大,可以不用修改就在linux和windows使用,避免了使用内核函数的移植性问题。二、源码分析 类的构造函数就默认初始化b...
  • sinat_22336563
  • sinat_22336563
  • 2017-03-31 10:29:56
  • 592

图像修正,橡皮筋类,CDIB

  • 2011年02月28日 18:04
  • 2.07MB
  • 下载

java学习之实验三

(1)编写3个基本类: Triangle, Ladder和Circle,分别用来刻画“三角形”、“梯形”和“圆形”类; 1个主类: Compute,负责计算每个形状的面积或周长。 具体要求:  ...
  • LDUtyk
  • LDUtyk
  • 2016-04-13 17:42:56
  • 1044

(Caffe)基本类Filter(五)

本文地址: Filter类在Caffe中用来初始化权值大小,有如下表的类型: 类型 派生类 说明 constant ConstantFiller 使用一个常数(默认为0)初始化权...
  • mounty_fsc
  • mounty_fsc
  • 2016-06-17 14:44:30
  • 3663

Java 基本类

System类   常用方法。 currentTimeMillis
  • u010400950
  • u010400950
  • 2014-06-15 00:13:55
  • 262

(Caffe)基本类Solver、Caffe、Batch(二)

本文地址: 1 Solver1.1 简介其对网络进行求解,其作用有: 提供优化日志支持、创建用于学习的训练网络、创建用于评估的测试网络 通过调用forward / backward迭代地优化,更新权值...
  • mounty_fsc
  • mounty_fsc
  • 2016-04-07 18:22:46
  • 4161

java 常用类

  • 2013年12月04日 15:29
  • 32KB
  • 下载
收藏助手
不良信息举报
您举报文章:(Caffe)基本类InternalThread(三)
举报原因:
原因补充:

(最多只允许输入30个字)