(Caffe)基本类InternalThread(三)
2016-04-07 本文已影响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
说明:
-
每个派生类都需要实现一个
InternalThreadEntry()
(但为什么不设计成纯虚函数,而是设计成一个未实现的虚函数呢?) -
thread_
的初值为NULL
,所以单单继承InternalThread
不会产生新的线程 -
但是调用
InternalThread::StartInternalThread()
函数,则会执行以下代码,重置thread_
,该线程绑定的函数是InternalThread::entry()
thread_.reset(new boost::thread(&InternalThread::entry, this, device, mode, rand_seed, solver_count, root_solver));
-
在
InternalThread::entry()
中,调用了InternalThread::InternalThreadEntry()
,该函数在不同的派生类中的实现是不同的(即不同的子线程完成的任务不一样)
[1].http://caffe.berkeleyvision.org/doxygen/classcaffe_1_1InternalThread.html