JobQueue 질문이있습니다
350
작성한 질문수 44
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으로 등록)
0
윗글처럼
Flush를 보면 싱글쓰레드처럼 따로 lock을 걸지않고 실행되고 있습니다.
만약에 timer.Interval에 설정한 시간이 지났는데 flush가 다 안끝나서 다른 쓰레드가 flush로 들어오면 멀티쓰레드 환경이 되서 오류가 발생할 수도 있을 것 같은데
이런 상황이면 구조상 1개의 쓰레드로만 운용된다는 것이 보장 안되는 것 아닌가요.. ㅇ..ㅇ
0
아 그 부분은 잘 이해하셨고요.
현재 C# 서버는 간단하게 [게임로직/DB/..] 이런 식으로 역할별로 쪼개서
단일 쓰레드가 게임 로직을 담당하는게 맞구요.
실제로 이렇게 만드는 경우도 많이 있습니다.
보다 고차원적으로 만들려면 Flush를 일종의
Lock-based Queue 혹은 Lock-Free Queue 등에서 관리해서
일감을 실행하게 하면 되는데
이 부분은 너무 난이도가 높아 C++ 서버에서만 다룹니다.
0
아하 감사합니다
근데
현재 C# 서버는 간단하게 [게임로직/DB/..] 이런 식으로 역할별로 쪼개서
단일 쓰레드가 게임 로직을 담당하는게 맞구요.
이 말이 timer.Interval에 설정한 시간을 넘길만큼 많은 일을 하지 않아서 괜찮다는 말로 이해해도 되는건가요??
MessagePack
0
85
1
본인 플레이어 이동 관련 질문
0
49
1
Part7 Part9 질문이 있습니다.
0
72
1
.
0
116
1
.
0
105
2
게임 로직 루프에서 게임 틱 누락으로 인한 높은 CPU 사용 문제
0
91
1
타일 팔레트 깔았는데도 안돼요
0
115
2
2D로 그냥 만들어도 되나요?
0
81
2
지난 강의와 이어지는게 맞을까요?
0
80
2
순환참조 문제로 인해 발생하는 문제는 없을까요?
0
162
2
유니티 클라와 C++서버연동
0
277
2
멀티플레이 테스트 환경 관련 질문입니다
0
207
3
강의 후반부에 순서 동기화를 위해 잡큐를 사용 안 한 부분 질문입니다!
0
150
2
코드 관련한 몇 가지 질문입니다!
0
153
2
3d 프로젝트 이동 동기화 관련
0
321
4
파트 7 스트레스 테스트 질문 드립니다.
1
189
2
맵 이동 방식
0
133
0
맵 이동 관련해서 질문드립니다.
0
91
1
안녕하세요 도저히 알 수 없는 오류가 나와서 질문드려요,,
0
201
2
안녕하세요. 일전에 질문 드린 포폴 준비 관련 질문의 추가 질문입니다!
0
160
1
[팁] 2024년 기준 버전 이슈?
0
455
1
SendBuffer.cs 삭제 후 대체 되는 부분의 장단점?
1
203
1
지금 강의의 유니티 클라를 IOCP 서버와 연동하는 것
0
336
2
PushAfter 사용 질문
0
192
1





