代码拉取完成,页面将自动刷新
#pragma once
#include <functional>
#include <vector>
#include <atomic> //C++11提供的原子类型,底层通过CAS实现的
#include <memory>
#include <mutex>
#include "noncopyable.h"
#include "Timestamp.h"
#include "CurrentThread.h"
class Channel;
class Poller;
//事件循环类,主要包含了两个大模块:Channel、Poller(epoll的抽象基类)
class EventLoop : public 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);
bool hasChannel(Channel* channel);
//判断EventLoop对象是否在自己的线程里面
bool isInLoopThread() const { return threadId_ == CurrentThread::tid(); }
private:
void handleRead(); //处理wakeup唤醒相关的逻辑的
void doPendingFunctors(); //执行回调
using ChannelList = std::vector<Channel*>;
std::atomic_bool looping_; //原子操作的bool值
std::atomic_bool quit_; //标志退出loop循环
const pid_t threadId_; //记录当前loop所在线程的id
Timestamp pollReturnTime_; //poller返回发生事件的channels的时间点
std::unique_ptr<Poller> poller_;
//当mainLoop获取一个新用户的channel,通过轮询算法选择一个subLoop,
//通过wakeupFd_唤醒subLoop来处理channel
int wakeupFd_;
std::unique_ptr<Channel> wakeupChannel_;
ChannelList activeChannels_; //Loop所管理的所有的Channel
Channel* currentActiveChannel_;
std::atomic_bool callingPendingFunctors_; //标识当前loop是否有需要执行的回调操作
std::vector<Functor> pendingFunctors_; //存储loop需要执行的所有回调操作
std::mutex mutex_; //互斥锁用来保护上面vector容器的线程安全操作
};
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。