• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

HandlerMove lock 관련 질문 드립니다.

22.03.06 22:39 작성 조회수 141

0

락이 없어도 정상 작동을 하지 않나요?

1) PlayerInfo info , S_Move resMovePacket , 매개변수 기반으로 만들어 지고 있으니 safe 

2) Broadcast 안에 이미 락이 있으니 safe 

3) C_MoveHandler 에서 player , room 참조를 한번더 받았으니 크래쉬로 부터 안전

서버 프로그래밍 에선 락이 제일 어려운거 같습니다.

 

답변 1

답변을 작성해보세요.

0

네 맞습니다. 그리고 아주 잘하고 계십니다 ㅎㅎ
처음엔 어느 부분이 경합이 일어나는지조차 헷갈리는데요.
(특히 C++ 시작해서 메모리에 대한 이해가 있는 상황이 아니라면)


여기선 movePacket는 1개의 쓰레드에서만 알아 문제 없지만,
player가 경합해서 사용하는 객체입니다.
문제 되는 부분은 빨간색 부분이고, 특히 info.PosInfo를 덮어쓰고 있는데요.
좌표 갱신 측면에서 정말 깐깐하게 먼저 온 패킷 순서대로 해줘야 한다면
락을 잡고 보장을 처리해줘야 할 것이고, 크게 상관없다면 락을 걸지 않더라도 되겠죠.
나중에 가서 골드라거나 더 중요한 정보가 있다면 락은 걸어줘야
이상한 상황을 예방할 수 있을겁니다.
(ex. 골드가 두번 연속으로 setgold(1000), setgold(500)을 순차적으로 요청했는데,
락을 안 걸고 타이밍 이슈로 뒤에부터 실행되면서 최종 골드가 500이 아닌 1000이 될 수도 있겠죠)