인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

literate_t님의 프로필 이미지
literate_t

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

JobQueue #5

DoGlobalQueueWork함수에 관한 질문입니다!

작성

·

49

·

수정됨

0

안녕하세요.

이전 질문 중에 DoGlobalQueueWork가 실행되면서 GlobalQueue에서 일감을 꺼내 멀티스레드 환경에서 처리되는 도중에, 데이터가 겹쳐 레이스 컨디션이 발생할 수 있냐는 질문에 강사님께서 멀티스레드 이슈가 다시 생길 수도 있다고 말씀하셨습니다. 관련해서 궁금한 점이 생겼습니다.

적어도 저희 강의에 적용된 코드에 국한해서, 데이터가 겹친다는 이유로 레이스 컨디션이 발생할 수 없지 않나요? GlobalQueue로 데이터를 넣고 빼는 부분에 락을 거니까 해당 부분에서는 아주 잠깐의 락 대기 시간이 생길 수 있고, 일감을 일단 Pop한 이후에는 데이터가 겹치는 일이 생길 수 없는 것 같은데, 이전 답변을 보고는 생길 수 있는 가능성이 없지 않다는 느낌을 받아서 이 궁금증을 해소하고 싶습니다~

이전 질문에서 답변해주신 것 중에 Zone 단위로 JobQueue를 배치하는 경우 데이터 공유가 거의 없고 Actor 단위일 경우엔는 필연적으로 순간에 Lock을 걸거나, 정밀 조정이 어려우니까 그냥 락 걸지 않고 데이터를 get할 수 있다는 내용은 이해했습니다!

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. literate_t님께서 질문하신 멀티스레드 환경에서 DoGlobalQueueWork 함수 실행 시 레이스 컨디션 문제에 대해 더 이해하기 쉽게 설명드리겠습니다.

멀티스레드 환경에서 Race Condition은 여러 스레드가 하나의 공유 자원에 동시에 접근할 때 발생할 수 있는 문제입니다. GlobalQueue에서 데이터를 입출력할 때 락을 사용함으로써 해당 구간에서는 Race Condition이 발생하지 않도록 보호할 수 있습니다. 그러나, 이 보호 조치가 각 작업 자체의 내부에서 공유하는 데이터를 완벽하게 보호하지는 않습니다.

구체적인 예:
- GlobalQueue에서 데이터를 꺼내는 순간까지는 락이 걸리지만, 꺼낸 후 각 스레드의 작업 수행 시에 또 다른 공유 자원에 접근하거나 어떤 데이터의 일관성 보장이 필요한 경우라면 Race Condition이 발생할 수 있습니다.

따라서, 배우신 강의 내에서 특정 구간에서는 Race Condition 방지를 위한 락이 적절히 사용되고 있을 가능성이 높지만, 전체적인 멀티스레드 운영에서 각 작업의 특성에 따라 상황은 달라질 수 있습니다. 특히, Zone 단위로 JobQueue가 배치된 경우에는 상대적으로 데이터 공유가 덜 발생하기 때문에 이러한 문제가 적지만, Actor 단위의 경우에는 순간적인 잠금을 고려해야 할 때가 있습니다.

이 점에 대해 보다 명확한 해답을 얻고 싶으시다면, 관련 코드나 실제 환경에서의 예시를 검토하면서 멀티스레드 프로그래밍 시의 공통적인 주의사항을 더 이해하는 것이 좋습니다.

아래 질문 답변도 참고하시면 도움이 될 수 있을 것 같습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

literate_t님의 프로필 이미지
literate_t

작성한 질문수

질문하기