因为one loop one thread的两个结构就是 EventLoop 和 Thread ,所以EventLoopThread是此结构的面向对象的实现。他的数据成员包括Eventloop和Thread。此对象的生命周期由线程池对象管理。
该对象的数据成员有:
EventLoop *loop_;
bool exiting_;
Thread thread_;
MutexLock mutex_;
Condition cond_;
该对象除构造函数和析构函数之外只有一个成员函数
EventLoop* startloop();
该对象在构造的时候绑定一个固定的线程执行函数,该函数将产生一个栈上的EventLoop对象并且执行其loop。退出线程时被析构。此函数在Thread创建的线程中执行。
EventLoopThread::EventLoopThread()
: loop_(NULL),
exiting_(false),
thread_(bind(&EventLoopThread::threadFunc, this), "EventLoopThread"),
mutex_(),
cond_(mutex_)
{ }
EventLoopThread::~EventLoopThread()
{
exiting_ = true;
if (loop_ != NULL)
{
loop_->quit();
thread_.join();
}
}
Thread创建的线程中执行的函数:
void EventLoopThread::threadFunc()
{
EventLoop loop;
{
MutexLockGuard lock(mutex_);
loop_ = &loop;
cond_.notify();
}
loop.loop();
//assert(exiting_);
loop_ = NULL;
}
one loop one Thread启动运行事件循环的函数:
EventLoop* EventLoopThread::startLoop()
{
assert(!thread_.started());
thread_.start();
{
MutexLockGuard lock(mutex_);
// 一直等到threadFun在Thread里真正跑起来
while (loop_ == NULL)
cond_.wait();
}
return loop_;
}