美文网首页Caffe
(Caffe)基本类InternalThread(三)

(Caffe)基本类InternalThread(三)

作者: 沤江一流 | 来源:发表于2016-04-07 18:40 被阅读452次

    本文从CSDN上转移过来:
    http://blog.csdn.net/mounty_fsc/article/details/51088262

    1 简介

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

    2 继承关系

    这里写图片描述

    说明:

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

    3 源代码

    /**
     * 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.
     */
    class InternalThread {
     public:
      InternalThread() : thread_() {}
      virtual ~InternalThread();
    
      void StartInternalThread();
    ...
    
     protected:
      /* Implement this method in your subclass
          with the code you want your thread to run. */
      virtual void InternalThreadEntry() {}
    
     ...
     private:
      void entry(int device, Caffe::Brew mode, int rand_seed, int solver_count,
          bool root_solver);
    
      shared_ptr<boost::thread> thread_;
    };
    
    }  // namespace caffe
    

    说明:

    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(三)

        本文链接:https://www.haomeiwen.com/subject/pbtvlttx.html