• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

멀티스레드 Job처리

24.05.04 02:27 작성 24.05.04 04:28 수정 조회수 124

0

제가 경험했던 환경에서는

네트워크스레드(N) -> MessageQueue -> 메인스레드(1)

사실상 메인로직이 싱글 스레드였습니다.

그렇다 보니 Queue에 들어오는 순서대로 메인스레드에서 처리했고, 느릴수도 있었겠지만 순서는 확실하게 보장이 되었습니다

 

그런데 현재 구조상

네트워크스레드(N) -> JobQ 메인로직(N)으로 진행되거나

네트워크스레드(N, timeLimit제한) -> GlobalQ 메인로직 (N)

 

으로 진행되다보니 궁금한게 생겼는데요

첫번째 궁금한점은

패킷이 ABC 순서로 왔을때,

AC는 JobQ1

B는 JobQ2을 수행한다고 가정하고

A, B, C를 각각 네트워크 스레드 1,2,3가 받았다면

스레드1가 A(수행시간1초)를 처리하는

스레드2는 B(수행시간3초)를 처리하고,

스레드3은 C(수행시간1초)를 Push만 한다고 하였을때

B가 먼저 들어왔지만

처리시간이 늦어 C패킷보다 답장을 늦게 보내는 상황이 발생할것 같은데요,

(시간이 1초 3초까진 아니겠지만 컴퓨터 입장에서는 충분히 코드의 짧은차이로도 발생 할 수 있는 경우라고 가정했을때)

과정에서 B처리중 죽어있으면 클리어가 안된다거나 하는 조건이 있고, B가 먼저 수행 되었지만 C처리가 먼저 끝나버려서 B의 결과가 바뀌는 경우는 어떻게 처리를 하면 좋을지 궁금합니다.

(꼭 이런 1개의 처리속도가 아니더라도, JobQ1의 작업 전부다 소모되는시간이 JobQ2의 작업 몇개를 수행하는것보다 빠르다면, 충분히 이런상황이 발생할 수 있다고 생각합니다)

다른 예시로 JobQ1에는 어마어마한 양의 일감이 쌓여있는상태에서 A가추가가 되고,

JobQ2에는 아무것도 없을때 B가 바로 실행이 될텐데,

이경우에도 A가 먼저 패킷이 도달했지만 B에 비해 아주 오랜 뒤에 처리가 될수 있을것 같다고 생각해서 이런경우 클라 입장에서는 분명 먼저 요청을 했는데 버그가 발생했다고 느낄수도 있다고 생각해서 질문드립니다.

 

두번째로 궁금한점은

Part4 과정이 거의 끝나가고 있어서 질문드리는 것인데요,

제가 메인스레드가 1개인것만 해봐서 멀티스레드를 어떻게 인게임컨텐츠에서 사용해야할지 감이 안잡혀서,

멀티스레드로 인게임 컨텐츠 부분의 객체를 접근할때, 락을 사용하는 예제가 있는 강의가 있는지 궁금합니다.

이과정이 끝나면 Part5를 바로 이어서 할예정입니다.

 

감사합니다

 

답변 2

·

답변을 작성해보세요.

1

날카로운 질문입니다.

1번에서 그렇게 순서 보장이 되어야 할 경우, 공용 잡큐를 사용해야 합니다.
(ex. 길드 처리 전용 잡큐라거나..)
Actor 모델로 가서 별도의 JQ1, JQ2가 실행할 경우 타이밍 문제는 어떻게 할 수가 없습니다.

2번에서는 강의에서 아직 그 정도 내용은 다루지 않습니다.
그 정도 내용을 보여드리려면 실전 게임을 만들어야 하는데,
단일 강의에서 하기엔 너무 벅찬 내용입니다.
앞으로 MMO Lab 시리즈를 반 년마다 돌면서,
기술을 바꿔가며 (C# Server -> C++ Server -> Actor Model , ...)
하나씩 만들어보려고 합니다.

TCC님의 프로필

TCC

질문자

2024.05.07

답변 감사합니다.

멀티스레드에 대한 정보는 해당 기술을 사용하는 회사를 들어가지 않는다면 접하기가 상당히 어렵군요..

아무래도 고급 기술이다보니 정보공유가 덜 이루어지는건 이해하지만, 상당수의 RPG게임제작 프로젝트 공고에서 멀티스레드환경을 요구하는게 조금 아쉽습니다..ㅜㅜ

최대한 멀티스레드를 이해하고 고민해서 개발해보았다를 어필하는것으로 만족해야하겠네요..

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.06

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

TCC님의 질문에 답변드리겠습니다.

첫번째로, 네트워크 스레드에서 처리되는 패킷 순서와 멀티스레드 처리에서의 동기화 문제에 관한 것입니다. 이러한 경우, 처리 순서를 보장하기 위한 몇 가지 방법이 있습니다. 예를 들어, 시퀀스 번호나 타임스탬프를 패킷에 포함시켜 처리 순서를 명시적으로 관리할 수 있습니다. 또한, 작업이 서로에게 영향을 주지 않도록 설계하거나, 특정 조건 하에서만 작업이 수행되도록 함으로써 이러한 문제를 완화할 수 있습니다.

두번째로, 멀티스레드에서 인게임 컨텐츠를 처리할 때 락을 사용하는 방법에 대한 예제에 대한 질문입니다. 멀티스레드 환경에서 락을 사용하는 것은 공유 자원에 대한 접근을 동기화하여 데이터 경쟁 상황을 방지하기 위함입니다. C++과 같은 언어에서는 std::mutex와 같은 뮤텍스 도구를 사용하여 특정 코드 영역의 동시 실행을 제어할 수 있습니다. 인게임 컨텐츠에서 락을 사용하는 구체적인 예제나 강의는 해당 과정의 커리큘럼이나 강사님의 추가 자료에서 찾아볼 수 있을 것입니다.

이해를 돕기 위해 구체적인 예제 코드나 더 자세한 사례가 필요하시다면, 관련 분야의 도서나 강의를 참고하시는 것도 좋은 방법 중 하나입니다. 멀티스레드 프로그래밍은 복잡할 수 있으니, 다양한 사례를 학습하며 점차 깊이 있는 이해를 하시길 바랍니다.

다른 질문이 있으시면 언제든지 문의해주세요.