本项目由 岩禾溪 原创
项目实战+新特性用法介绍
开源代码+博客解析+视频讲解GitHub+CSDN+BiliBili同步更新,三个平台同名【岩禾溪】
GitHub代码链接: GitHub - YanHeXi/muduo_cpp20
项目讲解视频连接:岩禾溪的个人空间-岩禾溪个人主页-哔哩哔哩视频
你的关注是我更新的最大动力
Poller.ixx
export module Poller;
import EventLoop;
import nocopyable;
import <vector>;
import Channel;
import Timestamp;
import <unordered_map>;
export class Poller : nocopyable
{
public:
using ChannelList = std::vector<Channel *>;
Poller(EventLoop *loop);
virtual ~Poller() = default;
virtual Timestamp poll(int timeoutMs, ChannelList *activeChannels) = 0;
virtual void updateChannel(Channel *channel) = 0;
virtual void removeChannel(Channel *channel) = 0;
bool hasChannel(Channel *channel) const;
static Poller *newDefaultPoller(EventLoop *loop);
protected:
using ChannelMap = std::unordered_map<int, Channel *>;
ChannelMap channels_;
private:
EventLoop *ownerLoop_;
};
模块导出和导入:
- 使用了
EventLoop
、nocopyable
、vector
、Channel
、Timestamp
和unordered_map
模块。 - 通过
export
关键字导出了Poller
类,使其能够被其他模块导入和使用。
类 Poller
:
-
构造函数
Poller(EventLoop *loop)
:- 接受一个指向
EventLoop
对象的指针作为参数。 - 初始化
Poller
类的成员变量。
- 接受一个指向
-
虚析构函数
virtual ~Poller() = default;
:- 虚析构函数,指定为默认实现。
-
纯虚函数:
virtual Timestamp poll(int timeoutMs, ChannelList *activeChannels) = 0;
virtual void updateChannel(Channel *channel) = 0;
virtual void removeChannel(Channel *channel) = 0;
- 这些纯虚函数需要在派生类中进行实现,用于执行轮询、更新通道和移除通道的操作。
-
成员函数
bool hasChannel(Channel *channel) const;
:- 检查指定通道是否存在于轮询器中。
-
静态函数
static Poller *newDefaultPoller(EventLoop *loop);
:- 返回一个
Poller
指针,用于创建默认的轮询器对象。
- 返回一个
-
成员变量
ChannelMap channels_;
:- 使用无序映射来存储文件描述符和对应的通道对象,用于快速检索通道。
-
保护成员
protected: EventLoop *ownerLoop_;
:- 保护类型的成员变量,指向所属的
EventLoop
对象。
- 保护类型的成员变量,指向所属的
Poller.cpp
import Poller;
import EventLoop;
import Channel;
Poller::Poller(EventLoop *loop)
: ownerLoop_(loop)
{
}
bool Poller::hasChannel(Channel *channel) const
{
auto it = channels_.find(channel->fd());
return it != channels_.end() && it->second == channel;
}
Poller
类部分实现:
-
构造函数
Poller::Poller(EventLoop *loop)
:- 接受一个指向
EventLoop
对象的指针作为参数,并在初始化列表中将其分配给ownerLoop_
成员变量。
- 接受一个指向
-
成员函数
bool Poller::hasChannel(Channel *channel) const
:- 该函数用于检查给定的通道对象是否存在于轮询器中。
- 首先通过
channel->fd()
获取通道的文件描述符,然后在channels_
这个存储通道的无序映射中查找该文件描述符。 - 如果找到了并且对应的通道对象就是传入的
channel
,则返回true
,表示该通道存在于轮询器中。 - 否则返回
false
,表示该通道不存在于轮询器中或者文件描述符对应的通道与传入的channel
不匹配。
功能:
hasChannel
函数用于在Poller
类中检查指定的通道对象是否存在于轮询器中,并对其进行匹配检查。这有助于确认通道是否已经被添加到轮询器中进行事件监听。
总结
可以无所谓,不能无所获
——岩