ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • strand로 동기화를 하려는데, 문제가 있다.
    프로그래밍/의문 2015. 12. 1. 15:51
    반응형

    strand 동기화를 하려는데 문제가 있다.


    2015년 12월 1일 화요일

    15:27


    mutex 대신 모든 동기화를 strand 하고자 했는데 난처한 문제가 생겼다

     

    게임 관리자와 게임 방은 각자의 strand 동기화 개체로 활용한다.

    유저는 게임 관리자에 접속해서 게임 방으로 이동한다.

    근데 게임 관리자 => 게임 이동 시에 문제가 있었다.

    발생 예측 상황은 입장이 처리되기 전에, 유저의 연결이 끊겨버릴 발생한다.

     

    유저

    게임 관리자

    게임

     

    [게임 관리자] 유저의 접속을 처리한다.

    [유저] 입장을 요청한다.

    [게임 관리자] 유저 입장을 등록한다.

    [유저] 연결을 끊는다. 유저의 관찰자들에게 연결 끊김을 통보한다.

    [게임 관리자] 연결 끊김을 등록한다.

    [게임 관리자] 유저 입장을 처리한다.

    [게임 ] 입장을 등록하며 유저를 관찰한다.

    [게임 관리자] 연결 끊김을 처리한다. <= 등록된 연결 끊김은 게임 관리자에만 연결이 상태에서의 등록이었다. 따라서 게임 방에겐 연결 끊김이 전파되지 않는다.

    [게임 ] 입장을 처리한다 <= 유저는 이미 접속이 끊긴 상태인데 입장을 처리한다.

     


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    game_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


    반응형
Designed by Tistory.