深入了解muduo库:EventLoopThread类

EventLoopThread类

class EventLoopThread {
private:
    EventLoop *loop_;
    Thread thread_;
public:
    EventLoop* startLoop();
};

startLoop()

one loop per thread 是moduo库设计的核心思想,为了保证这一点,EventLoop 类有一个成员const pid_t threadId_,记录创建该loop的线程id,表示该loop属于某一特定线程;以后可能会出现其他线程调用该loop的 public 函数的情况(特别是主线程调用工作线程的loop),这时候就要用这个 threadId_ 对比当前调用线程id,如果不一致需唤醒对应线程,让它来调用;

startLoop() 会在线程池生成工作线程时被调用,它的调用者是主线程,由于loop的threadId_const类型,只能在构造函数处被初始化且不能被另外修改,因此loop只能在工作线程处创建,而EventLoopThread 类中的EventLoop *loop_ 成员指向了该loop,该成员的赋值就在startLoop() 内,这里就涉及到了主线程和工作线程同步问题(主线程需要在工作线程完成loop创建后才能进行赋值),也就有了下面的代码:

// 主线程调用的startLoop()内
EventLoop* loop = NULL;
{
    MutexLockGuard lock(mutex_);
    while (loop_ == NULL) {
        cond_.wait();
    }
    loop = loop_;
}
// 工作线程的回调函数
EventLoop loop; // 工作线程创建loop
{
    MutexLockGuard lock(mutex_);
    loop_ = &loop;
    cond_.notify();
}
loop.loop(); // loop开启事件循环


深入了解muduo库:EventLoopThread类
http://example.com/2022/10/26/muduo-EventLoopThread/
作者
KingTom
发布于
2022年10月26日
许可协议