• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

JobQueue 질문이있습니다

23.07.07 16:49 작성 조회수 186

0

main에서 TickRoom함수 내부에서 timer를 이용해서 room.Update를 해주고
room.Update에서는 Flush를 해줍니다.


근데 Flush를 보면 싱글쓰레드처럼 따로 lock을 걸지않고 실행되고 있습니다.
만약에 timer.Interval에 설정한 시간이 지났는데 flush가 다 안끝나서 다른 쓰레드가 flush로 들어오면 멀티쓰레드 환경이 되서 오류가 발생할 수도 있을 것 같은데

이 문제는 현재 코드에서 예외처리를 안해준거죠?

https://stackoverflow.com/questions/37747650/do-timers-continue-if-function-didnt-finish

선생님께 찾아보고 질문한다는 성의를 보이기 위해서.... ㅎ..ㅎ

답변 1

답변을 작성해보세요.

0

Job 방식으로 갈 경우, Lock을 굳이 안 걸어도 됩니다.
왜냐하면 어차피 1개의 쓰레드에서만 Job을 실행한다는 것을
서버엔진 '구조'상으로 보장해주기 때문이죠.
다만 Job 방식을 사용할 경우 Lock 코드를 섞어 쓰는 것을 어지간하면 금지해야 합니다.
(단순한 get/set 정도만 Lock 처리를 하고, 그 외 로직은 Job으로 등록)

장재범님의 프로필

장재범

질문자

2023.07.10

윗글처럼

Flush를 보면 싱글쓰레드처럼 따로 lock을 걸지않고 실행되고 있습니다.
만약에 timer.Interval에 설정한 시간이 지났는데 flush가 다 안끝나서 다른 쓰레드가 flush로 들어오면 멀티쓰레드 환경이 되서 오류가 발생할 수도 있을 것 같은데

이런 상황이면 구조상 1개의 쓰레드로만 운용된다는 것이 보장 안되는 것 아닌가요.. ㅇ..ㅇ

아 그 부분은 잘 이해하셨고요.
현재 C# 서버는 간단하게 [게임로직/DB/..] 이런 식으로 역할별로 쪼개서
단일 쓰레드가 게임 로직을 담당하는게 맞구요.
실제로 이렇게 만드는 경우도 많이 있습니다.

보다 고차원적으로 만들려면 Flush를 일종의
Lock-based Queue 혹은 Lock-Free Queue 등에서 관리해서
일감을 실행하게 하면 되는데
이 부분은 너무 난이도가 높아 C++ 서버에서만 다룹니다.

장재범님의 프로필

장재범

질문자

2023.07.10

아하 감사합니다

근데

현재 C# 서버는 간단하게 [게임로직/DB/..] 이런 식으로 역할별로 쪼개서
단일 쓰레드가 게임 로직을 담당하는게 맞구요.

이 말이 timer.Interval에 설정한 시간을 넘길만큼 많은 일을 하지 않아서 괜찮다는 말로 이해해도 되는건가요??