反应器模式中File_descriptor和Handle的存储模型

时间:2013-05-11 04:09:49

标签: c++ handle reactor

我正在基于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(...)
    }
}

我的问题如何在这种情况下组织存储模型:存储句柄,以及文件描述符和句柄之间的映射(是否有适合的模式)

希望看到你的答案!

1 个答案:

答案 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调用中传递它们的值的其他参数相同。