ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • asio io_service의 dispatch가 post와 다른 점과 적절한 사용처
    프로그래밍/c++ - boost::asio 2016. 5. 1. 02:45
    반응형

    post()와 dispatch()의 차이 


    post()는 단순히 핸들러를 io_service 내부에 추가, 

    dispatch()는 호출될 때 호출 스레드 io_service:: run(), poll() 등을 통해 실행되었다면 dispatch한 핸들러를 io_service 내부에 추가하지 않고, 즉시 실행. 

    그렇다면 dispatch가 호출되는 게 io_service를 통해서가 아니라면 어떨까? post처럼 io_service 내부에 추가된다.


    코드로 보자면..

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    int main()
    {
        using namespace boost::asio;
        
        io_service proactor;
     
        boost::thread_group threads;
        
        for(int i = 3; i != 0--i)
        {
            threads.create_thread([&]{ proactor.run(); });
        }
     
        auto handler = []{ /* do nothing */ };
     
        proactor.dispatch(handler); // 이 핸들러는 io_service에 post 됨
     
        threads.join_all();
     
        return 0;
    }
     

    cs



    그래서 어떻게 사용하는 게 좋을까?


    예를 들자면 위 상황에 적합하다는 것이다. 

    close를 실행시키는 것은 io_service가 호출시키는 문맥일 수도 있지만 그렇지 않을 수도 있다. close를 실행시키는 곳이 io_service가 호출한 핸들러의 내부라면 dispatch된 핸들러는 곧바로 실행된다. 반면 외부라면? post 된다. 스마트하네!

    즉, io_service에 의해 호출된 이벤트 핸들러 안에서 다시 post하는 비용을 줄여준다.

    그렇기 때문에 io_service에 의해 호출된 이벤트 핸들러 안에서 호출될 경우 컨텍스트가 유지된다는 것이다. 

    하지만, io_service에 의해 실행되는 것이 아니라면 컨텍스트는 유지되지 않는다. (이 부분을 주의!)

    지금 실행하는 dispatch는 먼저 post된 핸들러보다 먼저 실행될 것이므로 순서가 중요한 경우 주의를 기울여야 한다.



    one more


    컴포넌트 구조 설계에서도 내부 메세지 처리용으로 dispatch 함수를 정의하기도 하는데, 내부 메세지가 메세지를 호출할 때에는 다시 post 하는 일 없이 실행해도 괜찮으나, 외부에서 메세지를 주입하는 post하는 방식이 되어야 하므로 이 경우에도 이와 같은 개념이 쓰인다.



    dispatch에 대해 알려주신 네오 면접관님, 이해를 도와준 codesafer님 감사합니다.

    반응형
Designed by Tistory.