그리고 플레이어 행동에 대한 처리는 각 방을 잠근 후에 합니다. 게임 서버에서 플레이어 A에 대한 처리를 할 때는 다음과 같이 작동합니다.

    1. 공통 데이터(방 목록 등)를 잠급니다.

    2. 플레이어 A가 들어 있는 방을 방 목록에서 찾습니다.

    3. 공통 데이터를 잠금 해제합니다.

    4. 찾은 방을 잠급니다.

    5. 플레이어 A의 방 안에서 처리를 합니다.

    6. 방을 잠금 해제합니다.

    이 과정을 코드로 표현하면 다음과 같습니다.

    MyGameServer.DoSomething(playerID)
    {
      lock(m_critSec);
      room = m_roomList.find(player);
      Unlock(m_critSec);
     
      lock(room.m_critSec);
      room.DoSomething(playerID);
      Unlock(room.m_critSec);
    }

    멀티스레드 게임 서버를 만들 때 크게 주의할 점은 시리얼 병목과 교착 상태입니다. 특히 파일을 액세스할 때 자주 잠그는 뮤텍스를 잠근 채로 액세스하는 경우 성능 저하가 자주 발생합니다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.