• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

FindPlayer 외부에서 호출

21.05.24 19:57 작성 조회수 152

0

JobQueue 강의 14분 쯤에 FindPlayer같이 GameRoom과 관련된 함수들은 완전 엉뚱한 외부에서 호출되면 크래시가 난다고 하셨는데, 이부분이 이해가 잘 안됩니다.

이제 따로 주방장이 있으니 일감을 던져주기만 하는 식으로 로직의 스타일이 변한거는 알겠는데,

전혀 엉뚱한 곳에서(ClientSession) FindPlayer를 호출 한다고 하더라고 주방장은 주방장대로 JobQueue에 담긴 일을 처리하고 있고,

FindPlayer를 쌩으로 호출한 스레드는 알아서 FindPlayer를 처리할 것 같고,

FindPlayer의 경우는 또 _players(Dictionary)를 foreach로 순회하면서 Read만 해서 Lock을 안걸어줘도 문제가 안될거 같은데

왜 쌩으로 호출을 하면 안되나요?

답변 2

·

답변을 작성해보세요.

1

FindPlayer를 쌩으로 호출한 스레드는 알아서 FindPlayer를 처리할 것 같고,

-> 바로 '알아서' 처리하는게 문제입니다.

FindPlayer의 경우는 또 _players(Dictionary)를 foreach로 순회하면서 Read만 해서 Lock을 안걸어줘도 문제가 안될거 같은데

-> 본인만 _players(Dictionary)를 Read만 한다고 안전한게 아닙니다.
JobQueue를 호출하는 쪽에서 _players를 Write할 수 있기 때문이죠.
JobQueue를 사용할 때는 실행하는 쓰레드 = 1개라는 가정을 하고
코드가 만들어지기 때문에 Lock을 전혀 걸지 않고 있고,
그 상황에서 누군가가 공유 데이터에 접근하면 문제가 일어날 수 있습니다.

0

조영웅님의 프로필

조영웅

질문자

2021.05.24

감사합니다!