boost asio - 정리 4 (strand 적용)

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

1. 목적

boost asio 정리 -4는 정리 3에서 multi-thread에서 동일 handler로 처리될 경우 공유 자원에 대한 접근을 제어하기 위해서 lock대신 boost strand를 적용한 예제이다. strand는 handler 처리에 대해서 순차적인 처리를 보장해서 공유 자원 접근에 대한 제어를 lock 객체와 유사하게 해 준다.


2. 코드 설명

post()함수에 strand.wrap()함수로 handler를 한번 wrapping해 주면 strand 동작을 위해서 해 줄 일은 끝난다. 하지만 여기서 눈여겨 봐야할 부분이 strand1과 strand2 두 개의 객체를 선언하였는데 strand1로만 post함수를 wrapping했을 경우와 post 함수를 각각 strand의 wrap함수로 했을 때 동작은 다르다. 결론은 strand 하나의 객체로 wrapping해야지만 진정한 동기를 맞출 수 있다.


아래 코드는 start 함수의 strand wapping 하는 부분의 일 부분만 캡쳐한 것이고, 첫번째로 같은 strand 객체로 wrapping 했을 때 코드와 결과이다.



결과: 첫번째 post에 할당된 handler가 모두 완료되고, 두번째 handler가 순차적으로 돌고 있다.



아래 코드는 post 함수에 서로 다른 strand 변수를 사용했을 때의 코드 조각이다.



결과: 서로 경쟁적으로 돌고 있음을 알 수 있다. 실행 결과를 보기 좋게 하기 위해서 루프는 5번만 돌렸다.



3. 전체 코드



4. 정리


strand를 이용한 공유 자원 처리 방법까지 알아보았다. 이제 남은 것은 work에 대한 것이다. work의 동작을 비동기IO아닌 예제에서 알아보기에는 좀 어려운 점이 있지만 예제 차원에서 억어지로 다음절에서 알아본다.


: