어제 배운 내용이다.
this포인터를 사용하는 람다식을 작성하면 해당 람다식이 생성되는 시점의 this가 박제되어 들어간다.
이 문제 때문에 정상적으로 세션이 해제되지 않는 버그가 있었다.
우선 세션이 파기되는 조건은 인자로 주어지는 expire_time이상의 시간이 지나면 자동으로 세션 객체가 해제되도록 되어있다.
세션 생성자에서 타이머에 this->세션파기() 함수를 람다로 넣고 다른 쓰레드에서 시간을 세다가 해당 람다를 호출하는 방식이다.
내가 생각했던 작동 방식은 해당 세션이 복사된다면, this포인터가 가리키는 객체도 함께 변해서 복사된 객체도 정상적으로 세션이 해제될 줄 알았다.
하지만 세션을 복사해도 람다식에 선언했던 this의 주소는 바뀌지 않았다.
리스너에서 받은 정보를 바로 전달하는 것이 아니라 중간에 한번 복사해서 큐에 넣었다가 차례가 올 때 실제로 실행을 하는 방식이므로 복사를 없애기는 힘들것 같다. (방법을 찾아보긴 해야겠다.)
현재는 복사되어 전달된 객체의 정보를 복사하여 새로운 세션을 생성하고 정보 전달용 세션은 그대로 해제하고 있다.
'프로젝트 > bankserver' 카테고리의 다른 글
[c++/boost::asio] Bank Server 개발일기 (0) | 2020.04.19 |
---|---|
[c++/boost::asio] Bank Server 개발일기 (0) | 2020.04.17 |
[c++/boost::asio] 개발 일기 (0) | 2020.04.16 |
시작 (0) | 2020.04.10 |