작성
·
293
1
쓰레드들이 DoGlobalQueueWork함수를
이용해서 JobQueue를 처리해주고 있는데
이렇게 되면 쓰레드들이 Job을 처리하는 도중에 데이터가 곂쳐서 레이스컨디션상황이 발생하는지 궁금합니다.
만약 그렇게되면 lock을 사용해야할까요??
답변 1
0
예리한 질문인데요.
GlobalQueue에 들어갔다가 다시 여러 쓰레드에 배분되어 실행된다면,
물론 멀티쓰레드 이슈가 다시 생길 수도 있습니다.
다만 대부분의 경우 여러 JobQueue 간에 공유하는 데이터는 생각보다 많이 생기지 않습니다.
지금 다루기엔 어려운 내용인데
Zone 단위로 JobQueue를 배치하는 경우 JobQueue 간 데이터 공유가 거의 없고
(하나의 지역에서 모든 일들이 일어나기 떄문)
Actor 단위로 JobQueue를 배치할 경우 필연적으로 아주 잠시 Lock을 걸어서 데이터를 빼오거나
아니면 락을 걸지 않아도 크래시가 나지 않는 (ex. 배열)을 사용해서 우회합니다.
물론 레이스 컨디션은 발생하지만, 그렇다 한들 크게 상관없는 경우도 있습니다.
예를 들어보면,
액터 단위로 배치한다 가정할 때 실제로 자신의 정보를 건드리는 것은
무조건 해당 액터의 JobQueue에서 일어나서 문제가 없습니다.
그러나 외부의 다른 액터가 해당 정보를 긁어올 필요성이 종종 생깁니다.
User 2명이 서로 전투가 일어났고 User 단위로 JobQueue가 걸려 있는 경우.
상대방의 Hp가 얼마인지 정말 얻어오고 싶은데,
그렇다고 상대 객체에 Lock을 걸고 GetHp()를 하기엔 아쉬우니,
락을 걸지 않고 일단 쿨하게 갖고 오는 것이죠.
이럴 경우 상대측에서 SetHp가 병렬로 실행된다면
HP가 정말 [현재 최종값]이 맞으리라는 보장은 없게 되지만,
그 정도로 정밀하게 타이밍을 맞춰야 할 필요는 없으니 넘어가는 것입니다.
비슷하게 이전에 T 모 게임 코드를 보니
유저가 걸린 버프 목록을 int buffs[MAX_COUNT]; 같은 배열로 관리해서,
30번 버프가 있는지 그냥 배열을 쭉 스캔해서 체크했는데요.
그 와중에도 비슷하게 버프가 바뀔 수 있으니
해당 정보가 100% 유효하다 보장은 못하지만
위의 HP 문제와 유사하게 크게 상관 없는 것이죠.
빠른 답변 감사합니다.
큰단위로 잡큐를 배치하면 데이터공유가 거의없는것과
액터단위로 배치된경우 락을 잡는 건 이해됬지만
마지막 락을 걸지 않아도 크래시가 나지 않는 배열을 사용한다는 부분이 이해가 되지 않는데 짧게 나마
설명 가능 할까요?