栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

302-重写C++muduo库(EventLoopThread事件线程类)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

302-重写C++muduo库(EventLoopThread事件线程类)

EventLoopThread事件线程类
  • 前面的Thread类,只是封装了一个线程;
  • EventLoopThread:one loop per thread,一个线程中有一个loop,一个loop运行在一个线程上!
1、EventLoopThread.h

muduo库中的信号量和互斥锁的相关操作,我们直接使用C++11里面的Thread类相关操作,不使用Linux系统的了,更加方便快捷!

ThreadInitCallback线程初始化的一个回调操作,因为底层一个loop运行在一个线程,要做一些初始化的操作的话,可以给它传递一些操作,可以传递回调函数,在EventLoopThread刚创建时,即线程中刚创建一个EventLoop后,可以调用ThreadInitCallback函数,进行一个初始化操作!如果没有传,什么也不用做!

ThreadInitCallback执行时机:底层起一个新线程,去绑定一个loop的时候,此时什么事情都没做,先检查有没有ThreadInitCallback回调操作,有回调操作,就对loop进行操作!

#pragma once

#include "noncopyable.h"
#include "Thread.h"

#include 
#include 
#include 
#include 

class EventLoop;

class EventLoopThread : noncopyable
{
public:
    using ThreadInitCallback = std::function; 

    EventLoopThread(const ThreadInitCallback &cb = ThreadInitCallback(), //线程初始化的回调 
        const std::string &name = std::string());
    ~EventLoopThread();

    EventLoop* startLoop();//开启循环 
private:
    void threadFunc();//线程函数,创建loop 

    EventLoop *loop_;
    bool exiting_;//是否退出循环 
    Thread thread_;
    std::mutex mutex_;
    std::condition_variable cond_;
    ThreadInitCallback callback_;//初始化操作 
};

2、EventLoopThread.cc

notify_one():通知一个等待在mutex_上的线程,将其唤醒!

通知谁呢,就是startLoop函数所在的线程,让它获取互斥锁mutex_!

当我们调用startloop函数时,底层才创建一个新线程(即threadFunc中,就是真正执行loop的线程)

在threadFunc线程中,loop有没有初始化好,我们不知道,因此用条件变量进行通知!

初始化好了在startloop中才可以继续执行!

最后,在threadFunc线程函数中,开启loop循环。

#include "EventLoopThread.h"
#include "EventLoop.h"


EventLoopThread::EventLoopThread(const ThreadInitCallback &cb, 
        const std::string &name)
        : loop_(nullptr)
        , exiting_(false)
        , thread_(std::bind(&EventLoopThread::threadFunc, this), name)//绑定回调函数
        , mutex_()
        , cond_()
        , callback_(cb)
{

}

EventLoopThread::~EventLoopThread()//析构函数
{
    exiting_ = true;
    if (loop_ != nullptr)
    {
        loop_->quit();
        thread_.join();
    }
}

EventLoop* EventLoopThread::startLoop()//开启循环
{
    thread_.start();//启动底层的新线程
	//启动后执行的是EventLoopThread::threadFunc
    EventLoop *loop = nullptr;
    {
        std::unique_lock lock(mutex_);
        while ( loop_ == nullptr )
        {
            cond_.wait(lock);//挂起,等待
        }
        loop = loop_;
    }
    return loop;
}

//下面这个方法,start()后的执行的,也就是在单独的新线程里面运行的1
void EventLoopThread::threadFunc()
{
    EventLoop loop;//创建一个独立的eventloop,和上面的线程是一一对应的,one loop per thread

    if (callback_)//如果有回调
    {
        callback_(&loop);//绑定loop做一些事情
    }

    {
        std::unique_lock lock(mutex_);
        loop_ = &loop;//就是运行在这个线程的loop对象
        cond_.notify_one();//唤醒1个线程
    }

    loop.loop();//相当于EventLoop loop  => Poller.poll
    std::unique_lock lock(mutex_);
    loop_ = nullptr;
}

3、小结

Thread类执行的线程函数,就是EventLoopThread就是在构造构造函数绑定的threadFunc回调函数。

4、编译项目


OK的!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/933998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号