boost asio 정리 - 2 (io_service single thread 처리)

Program Lang./C++ 2017. 5. 11. 14:46

1. 목적

boost asio 정리 -1 첫번째 한계인 io_service start 시점부터 main() 함수가 block되는 한계를 개선하기 위한 코드


2. 코드 설명

정리-1과의 차이점은 boost::scoped_ptr<boost::thread> pThread; 추가이다. io_service에 대한 처리를 별도의 thread를 통해서 처리함으로써 main() 함수의 block을 막았다. 따라서 io_service의 printerHandler가 동작 중에도 main()함수에서 Key입력이나 다른 동작에 대해서 interactive하게 user에게 반응할 수 있다.


지금도 한가지 명확하지는 않지만 operation 맴버변수는 강제로 printerHander를 종료하기 위해서 넣었다. 결론적으로 io_service가 start되면 post()함수에 설정된 handler가 완전히 종료되어야지만 io_service 종료됨을 알 수 있다.




3. 실행결과

아래 실행 결과는 printerHandler loop 동작 중에 Enter 키를 누르면 반응하는 것을 알 수 있다. 



4. 정리

io_service start를 별도의 하나의 thread에서 실행하도록 하여, main()함수의 thread는 block되지 않도록 하였다. 이 코드에서 살펴봐야 할 부분이 io_service start를 위해서 하나의 thread만 생성하였다. 즉, single thread 구현이다. 차 후에 논의하겠지만 single thread로 돌리기 때문에 post()함수를 추가로 호출하여 handler를 추가하더라도 post에 정의된 handler 함수간에는 sync가 맞는다. 흔히 말하는 공유자원에 대한 lock이 필요 없다는 것이다. main() 함수에서 post함수를 하나 더 추가해서 호출하더라도 모든 처리는 io_service start된 single thread에서 처리된다는 것이다. 다음절에서 multi-thread 예제를 봐보독 한다.


: