加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
EventLoop.h 2.14 KB
一键复制 编辑 原始数据 按行查看 历史
leo_1 提交于 2023-10-10 22:21 . eventloop实现完成
/***
* @Description:
* @Author: LeoTao
* @Date: 2023-10-03 22:44:26
* @LastEditTime: 2023-10-09 22:14:14
*/
#pragma once
#include "noncopyable.h"
#include "Timestamp.h"
#include "CurrentThread.h"
#include <functional>
#include <vector>
#include <memory>
#include <atomic>
#include <mutex>
class Channel;
class Poller;
/*事件循环类,主要包含两个模块 channel poller(epoll的抽象)*/
class EventLoop : noncopyable
{
public:
using Functor = std::function<void()>;
EventLoop();
~EventLoop();
void loop();//开启事件循环
void quit();//退出事件循环
Timestamp pollReturnTime() const {return pollReturnTime_;}
//在当前loop中执行cb
void runInLoop(Functor cb);
//把cb放入队列中,唤醒loop所在的线程,执行cb
void queueInLoop(Functor cb);
//唤醒loop所在的线程
void wakeup();
//eventLoop方法调用==》 poller的方法
void updateChannel(Channel * channel);
void removeChannel(Channel * channel);
void hasChannel(Channel* channel);
//判断evevntloop对象是否在自己的线程里面
bool isInLoopThread() const {return threadId_ == CurrentThread::tid();}
private:
void handleRead(); //wake up
void dePendingFunctors();//执行回调
using ChannelList = std::vector<Channel*>;
std::atomic_bool looping_; //原子操作,通过CAS实现
std::atomic_bool quit_;//标识退出loop循环
const pid_t threadId_;//当前loop所在线程的id
Timestamp pollReturnTime_;//poller返回发生事件的channels的时间点
std::unique_ptr<Poller> poller_;
int wakeupFd_;//主要作用:当mainLoop获取一个新用户的channel,通过轮询算法选择一个subloop,通过该成员来唤醒subloop来处理channel。
std::unique_ptr<Channel> wakeupChannel_;
ChannelList activeChannels_;
Channel* currentActiveChannel_;
std::atomic_bool callingPendingFunctors_; //标识当前loop是否有需要执行的回调操作
std::mutex mutex_;//互斥锁,用来保护下面vector容器的线程安全操作
std::vector<Functor> pendingFunctors_;//存储loop需要执行的所有回调操作
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化