-
strand로 동기화를 하려는데, 문제가 있다.프로그래밍/의문 2015. 12. 1. 15:51반응형
strand로 동기화를 하려는데 문제가 있다.
2015년 12월 1일 화요일
15:27
mutex 대신 모든 동기화를 strand로 하고자 했는데 난처한 문제가 생겼다
게임 관리자와 게임 방은 각자의 strand를 동기화 개체로 활용한다.
유저는 게임 관리자에 접속해서 게임 방으로 이동한다.
근데 이 게임 관리자 => 게임 방 이동 시에 문제가 있었다.
발생 예측 상황은 방 입장이 처리되기 전에, 유저의 연결이 끊겨버릴 때 발생한다.
유저
게임 관리자
게임 방
[게임 관리자]는 유저의 접속을 처리한다.
[유저]는 방 입장을 요청한다.
[게임 관리자]는 유저 방 입장을 등록한다.
[유저]는 연결을 끊는다. 유저의 관찰자들에게 연결 끊김을 통보한다.
[게임 관리자]는 연결 끊김을 등록한다.
[게임 관리자]는 유저 방 입장을 처리한다.
[게임 방]은 입장을 등록하며 유저를 관찰한다.
[게임 관리자]는 연결 끊김을 처리한다. <= 등록된 연결 끊김은 게임 관리자에만 연결이 된 상태에서의 등록이었다. 따라서 게임 방에겐 연결 끊김이 전파되지 않는다.
[게임 방]은 입장을 처리한다 <= 유저는 이미 접속이 끊긴 상태인데 입장을 처리한다.
1234567891011121314151617181920212223242526272829303132game_manager::req_game_join(session user, roomid room) // [게임 관리자] 입장 패킷을 처리하는 함수{auto self = shared_from_this();strand_.post([self, room, user]{rooms_.find(room); // 방을 찾습니다...room->post_join(user); // 방에 입장을 등록합니다.});}// ...game_manager::disconnected(session user) // [게임 관리자] 연결 끊김을 처리하는 함수{auto self = shared_from_this();strand_.post([self, user]{...// 연결 끊김을 처리합니다.});}// ...game_room::join(session user) // [게임 방] 게임 방 입장을 처리하는 함수{...strand_.post([self, user]{..// 입장을 처리합니다.});}cs 반응형'프로그래밍 > 의문' 카테고리의 다른 글
1바이트는 왜 8비트일까? (0) 2016.02.02 iocp 송신 관련 주의점 (0) 2016.01.26 코드 안에 if~else 구문이 많다는 건 다른 성격의 것들을 한 데에 모아놨다는 것이다. (0) 2015.11.14 간결하고 깨끗한 코드 vs 높은 성능 (0) 2015.11.11 ODBC BindParametert 사용 시 문자열의 길이로는 SQL_NTS를 넣어줘야 한다. (0) 2015.10.28