学习muduo库(14)之eventloopthread类

学习muduo库(14)之eventloopthread类_第1张图片

UML:

学习muduo库(14)之eventloopthread类_第2张图片

解释;

这个类体现了muduo库的思想:每一个线程有且有一个eventloop对象。此类的功能也是,创建一个线程,并在线程的回调函数中创造一个eventloop对象。

值得学习的细节:

EventLoop* EventLoopThread::startLoop()
{
  assert(!thread_.started());
  thread_.start();        //从这里开始变为两个线程

  EventLoop* loop = NULL;
  {
    MutexLockGuard lock(mutex_);
    while (loop_ == NULL)
    {
      cond_.wait();//如果子线程的eventloop对象还没有建立,主线程将会被挂起,知道被子线程唤醒
    }
    loop = loop_;
  }

  return loop;
}

void EventLoopThread::threadFunc()
{
  EventLoop loop;

  if (callback_)//如果存在回调函数,则执行回调函数,这里主要做一个初始化
  {
    callback_(&loop);
  }

  {
    MutexLockGuard lock(mutex_);
    loop_ = &loop;
    cond_.notify();
  }

  //可以看到这里的loop只是一个局部变量,这个函数退出这里的loop也将会被销毁
  //整个线程主要就是在执行loop.loop();
  loop.loop();
  //assert(exiting_);
  MutexLockGuard lock(mutex_);
  loop_ = NULL;  //避免出现野指针
}

 startLoop()这个函数中会生成一个新的线程。这个函数需要子线程先产生eventloop对象,主线程才能返回这个eventloop对象的指针。由于这里要求线程之间的先后顺序,于是这里就借助了条件变量来完成。

 

你可能感兴趣的:(学习muduo库)