(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)基本类InternalThread(三)

本文地址: 1 简介类InternalThread是一个虚类,是Caffe中的多线程接口,其本质为封装了boost::thread。2 继承关系说明: 可见,Caffe中使用多线程的地方主要是从磁盘读...

caffe代码阅读3:data_reader、internalthread以及blocking_queue的实现细节-2016.3.15

caffe中data_reader、internalthread以及blocking_queue的实现细节介绍

(Caffe)基本类DataReader、QueuePair、Body(四)

本文地址: 1 简介QueuePair与Body是DataReader的内部类。一个DataReader对应一个任务,一个Body生成一个线程来读取数据库(如examples/mnist/mnist_...

(Caffe)基本类Blob,Layer,Net(一)

本文地址:http://blog.csdn.net/mounty_fsc/article/details/51085654 Caffe中,Blob,Layer,Net,Solver是最为核心...

21天实战caff--2 第8天 Caffe数据结构-Blob基本用法

Caffe 的万丈高楼(Net)是按照我们的设计图纸(prototxt),用Blob这些砖块筑程一层层(Layer)楼房,最后通过SGD方法(Solver)进行简装修(Train),精装修(Finet...

Caffe 源码阅读笔记 [基本模块] Syncedmem & Blob

syncedmem syncedmem管理一段大小为size的内存。这段内存可以从GPU或者主机内存分配,syncedmem负责GPU和主机内存之间的同步。如果数据是在GPU里而要从主机内存取出,...
  • acmwwy
  • acmwwy
  • 2016年09月22日 22:46
  • 161

caffe修炼之路--数据的基本介绍

平台 Ubuntu14.04LTS        这篇文章主要是讲caffe中的数据存储机制,参考资料是caffe的官网,并且本文也并非深入理解这些东西,更多的是翻译官网上的文档,然后加上自己的理解...
  • thesby
  • thesby
  • 2015年02月06日 21:15
  • 2591

caffe中几个基本概念

caffe中几个基本概念: 1 caffe中的blob结构是用来进行数据存储,交换和处理网络中正向反向迭代时的数据和导数信息的数据结构 blob是caffe的标准数组结构,他提供了一个统一的内存接...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(Caffe)基本类InternalThread(三)
举报原因:
原因补充:

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