강의

멘토링

로드맵

Inflearn brand logo image

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

rhsj109999님의 프로필 이미지
rhsj109999

작성한 질문수

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

JobQueue #1

Job 내부 Execute에서 Lock을 잡지 않는 이유에 대해서

작성

·

115

0

안녕하세요. 양질의 강의 감사합니다.

 

다름이 아니라, Room Job내부 Execute를 구현하실때

 

Enter, Leave, BroadCast가 _players에 대한 락을 잡지 않는데,

 

이것은, main스레드에서 혼자 Flush함수를 실행하기 때문에 어차피 경합이 없어서 인가요?

 

만약 일감을 처리하려는 스레드가2개 이상일때부터는, 이런 공유데이터에 대해 작업을 하려는 경우 Execute 내부에서도 락을 잡도록 구현하게 될까요?

 

혹시, 이렇게 n개 이상의 Flush를 하려는 구조에서, Lock을 잡는게 맞다면,

Lock때문에 자신의 Execute가 더이상 진행되지 않을때, 그 락을 잡은 스레드에게, 자신의 Job을 던져버리고, 다른 일감을 찾으러 가는 구조도 구현되게 될까요?

 

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

Job 방식 사용 = 무조건 하나의 쓰레드가 실행하는 것이 전제입니다.
(일감 밀어넣는 것은 다수여도 무방)

따라서 내부 코드에서 싱글 쓰레드처럼 작업을 할 수 있습니다.
_players를 외부에서도 참조해야 하면 락을 걸거나
(threadsafe) LockFree로 동작하는 컨테이너를 사용해야 하지만
사실 Job + Lock이 동시에 사용하는 것은 어지간하면 자제해야 합니다.

 

0

안녕하세요, 인프런 AI 인턴입니다. rhsj109999님.

게임 서버 개발에서 멀티스레드 환경에서 작업 처리에 대한 질문을 주셨군요. 말씀하신 내용은 공유 자원에 대한 동기화 문제와 관련이 있습니다.

현재 강의에서는 “싱글 스레드에서 Job을 처리”하는 구조를 기반으로 하고 있기 때문에, Enter, Leave, Broadcast와 같은 작업에서 별도로 락을 잡지 않아도 됩니다. 모든 작업이 단일 스레드에서 순차적으로 처리되므로, 경합 상태가 발생하지 않기 때문입니다.

하지만 멀티스레드 환경에서 여러 스레드가 동시에 같은 자원(예: _players)에 접근하려는 경우라면, 데이터를 안전하게 관리하기 위해 락이 필요할 수 있습니다. 이때는 각 작업에 대해 락을 잡도록 설계해야 할 것입니다.

다만, 락을 이용한 구현은 때때로 성능 저하의 원인이 될 수 있습니다. 특히 락을 장시간 보유하거나 경합이 빈번하게 발생하는 경우에는 성능 문제가 더 심각해질 수 있습니다. 이런 경우에는 사용할 수 있는 방법 중 하나로 락을 자주 변환하거나 락을 보유한 스레드가 특정 작업을 다른 스레드에 위임하는 방법을 고려할 수 있습니다. 이는 복잡한 구현이 필요하며 상황에 따라 다르게 접근해야 합니다.

아래는 유사한 주제를 다룬 게시물과 토론을 참고하시면 도움이 될 것입니다:

  1. Job 관련 문의 - 여러 쓰레드에서 Execute가 실행되는 경우의 동기화 문제와 처리를 어떻게 할 것인지에 대한 논의입니다.
  2. JobQueue 질문이있습니다 - Timer 및 멀티스레드 환경에서 작업 처리에 대한 논의입니다.

위 링크들을 참고하여 추가적인 정보와 다른 학습자의 경험을 공유받으세요.

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

rhsj109999님의 프로필 이미지
rhsj109999

작성한 질문수

질문하기