0

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

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

希望看到你的回答!

4

1 回答 1

1

如果所有处理程序都具有相同的签名,那么使用std::functionin astd::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

于 2013-05-11T04:16:55.090 回答