boost asio - 3 (multi-thread 동작 고찰)

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

1. 목적

boost asio 정리 -2는 io_service 처리를 single thread로 하였다. 여기서는 mulit-thread처리 방식에 대해서 알아본다. 하지만 내용은 매우 간단하다. io_service thread를 여러개 만들면 된다.


2. 코드 설명

기존의 코드와 형태가 좀 바꿨다. boost thread group를 통해서 io_service를 2개 생성함을 볼 수 있다. (boost::thread_group io_threads). 결론적으로 io_service에 대한 처리를 multi-thread로 처리하는 것이다. 또한 post() 함수를 통해서 2개의 handler함수를 추가함을 알 수 있다.




3. 실행결과

기존 정리 -2와 유사하지만 차이는 io_service를 multi-thread로 처리한 것이고, 출력 결과도 post에 정의된 handler가 하나 모두 완료하고 다른 것이 순차적으로 되는 것이 아니라 random하게 실행된다. 여기서는 loop가 작아서 자세히 보이지 않지만 loop를 늘리면 random하게 보일 것이다. thread Id에 주목해보면 서로 번갈아 가면서 동작하는 것을 알 수 있다.



4. 정리

이제 strand에 대한 이야기를 해야 할 시간이 온 것 같다. 위의 예제의 문제에 대해서 이미 파악했을 것이다. post()함수에 do_print()함수가 두 개 동일한 함수가 호출되어서 결론적으로 multi-thread의 처리가 동일 handler에서 처리되는 것으로 do_print()함수에 공유자원이 있다면 공유자원에 대한 mutual access가 필요해진다. stackoverflow에 lock 객체를 쓰는 것이 낫나 아니면 strand를 쓰는 것이 호율적이냐에 대해서 논의가 많다. 각자의 구현이 따라 잘 판단해서 처리해야 하는 것이 답으로 보인다. strand에 대한 필요성과 이 예제의 문제를 개선하기 위한 방법을 알아본다.


: