boost asio 정리 - 1 기본동작

Program Lang./C++ 2017. 5. 11. 12:00

1. 목적

boost asio를 이용해서 IPTuner를 구현하는 과정에서 삽질한 내용을 정리한다. 국내 블로그들에는 정리가 잘 되어 있지 않는 것 같다. 따라서 stackoverflow등 여러 곳에서 참고한 내용을 기반으로 여기에 정리한다.


2. 코드 설명

정리-1부터 하나씩 기능을 추가해 가면서 고찰해 보도록 한다. 일단 아래 코드는 가장 간단한 예제이다. CTest라는 객체를 하나 생성하고 io_service를 start 시키는 코드이다.


여기서 자세히 봐야 할 부분은 io_service가 호출되면 아래 예제는 아래와 같은 특징을 갖는다.

  • main() 함수에서 키보드 입력해도 io_service의 handler함수인 printerHandler함수가 완료되기 전까지 block된다.

     즉, loop가 10번까지 돌 때까지 main()함수의 동작은 io_service가 call되는 시점부터 block된다.

  • loop가 10번 돌고나면 std::cin.get()함수에서 멈쳐있다.

여기서 좀 더 고찰해봐야 할 부분이 io_service start 호출 후에 main()함수 부분이 block되지 않고 User로부터 계속 응답을 하는 것이 필요하다. 또한 io_service는 일반적으로 asynchronization 동작에서 사용하는 것으로 이 예제로 모든 것을 커버하기에는 어렵다. 주제별로 하나씩 고찰해 본다. 



3. 실행결과

printerHandler가 동작 중일 때, Enter키를 강제로 두번 때려봤다. 예상되로 main()함수는 끝나지 않는다. 그리고 shell prompt는 두 번 Enter키를 입력한 결과로 printerHandler가 완료된 후에 결과를 출력하는 것을 볼 수 있다.



4. 정리

io_service start/poll이 호출되면 post에 정의된 callback함수가 완료될 때까지 io_service를 호출한 thread에서 block되는 것이 기본동작이다. start와 poll의 차이에 대해서는 최홍배님이 저술한 책 9장에 관련 내용이 정리되어 있다. 참고하시면 될 듯하다.

: