我正在基于Epoll在C ++中实现异步模式Reactor。 首先,我们将通过调用函数
向Reactor注册文件描述符template<typename Handle>
void Reactor::register(int descriptor, Handle handle){
//add this descriptor to epoll for monitoring
//store this handle with the key is the descriptor
}
然后,永远运行的方法hand_events被称为
void Reactor::handle_events(){
epoll_wait(..)
for(event in events){
//call the handle corresponding to the file descriptor return from epoll
//event.data.fd ==> handle
handle(...)
}
}
我的问题如何在这种情况下组织存储模型:存储句柄,以及文件描述符和句柄之间的映射(是否有适合的模式)
希望看到你的答案!
答案 0 :(得分:1)
如果所有处理程序都具有相同的签名,那么在std::function
中使用std::unordered_map
可能就足够了。
std::unordered_map<int, std::function<void(int)>> fdmap;
然后像
一样存储fdmap[descriptor] = handle;
简单地称为
fdmap[event.data.fd](event.data.fd);
当然,在事件处理程序中,您要确保映射实际上包含文件描述符。
如果在调用注册函数时使用std::bind
,则应该可以使用不同的签名:
my_reactor.register(fd, std::bind(my_handler, _1, another_argument, a_third_argument));
然后,当事件调度程序调用您的事件处理函数时,它将与使用第一个参数作为描述符调用它以及使用您在std::bind
调用中传递它们的值的其他参数相同。