2013-05-11 3 views
0

Epoll을 기반으로 C++에서 비동기 패턴 Reactor를 구현하고 있습니다. 첫째, 우리는 스토리지 모델을 구성하는 방법을 기능을 한 후, 영원히 실행 방법 hand_events는,File_descriptor 및 Handle in Reactor 패턴 저장소 모델

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(...) 
    } 
} 

내 질문이라고

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 
} 

그리고를 호출하여 원자로와 파일 기술자를 등록합니다 이 상황에서 : 핸들 핸들과 파일 기술자와 핸들 간의 매핑 (어떤 적합한 패턴이 있습니까?)

답변을보기를 원합니다!

답변

1

모든 처리기의 서명이 동일한 경우 std::unordered_mapstd::function을 사용하면 충분할 수 있습니다.

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 호출에서 전달한 값으로 전달합니다.

+0

Pilebor : 문제입니다. 나는 원자로 패턴을 일반화하고 싶다. ==> 서명을 고치고 싶지는 않다. ==> 핸들을 전달하기위한 템플릿을 사용했다. ==> 다른 아이디어가 있습니까, 아니면 boost :: asio가 어떻게이 문제를 해결할 수 있는지 알고 있습니까? – khanhhh89

+0

@ khanhhh89 업데이트 된 대답처럼 이벤트 핸들러를 등록 할 때'std :: bind'를 사용할 수 있어야합니다. –

+0

@ khanhhh89 그리고 Boost ASIO는'std :: bind' 또는'boost :: bind'와의 함수 바인딩을 사용하여 이것을 해결하지만 여전히 고정 된 시그니처를 가지고 있습니다. 핸들러는 _this_ 순서로 적어도 _these_ 인수를 취해야합니다. 그러나 'bind'의 마술을 사용하면 필요할 경우 더 많은 것을 취할 수 있습니다. –