inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

JobQueue #1

JobQueue #1 12:40 초

해결된 질문

326

조영웅

작성한 질문수 21

0

JobQueue #1 12:40 초 부분에 

'어차피 Pop을 실행하는 스레드는 Flush를 실행한 스레드 하나일뿐인데 왜 lock을 걸어줄까?'

의 답으로

'JobQueue에 일감을 Pop하는 동안에도, 넣는일을 다수의 스레드가 할 수 있기 때문이다.'

라고 답을 주셨는데 이부분이 좀 이해가 안 갑니다.  이해를 돕기위해 조금만 추가적으로 설명해 주실수 있을까요?

C# unity network

답변 1

1

Rookiss

말 그대로입니다!

JobQueue를 Pop하고 실행하는 애가 있다고 하더라도,
해당 JobQueue를 외부에서 접근하지 못하는 것은 아닙니다.
멀티쓰레드 특성상 다른 쓰레드들은 독립적으로 실행되기 때문에,
다른 쓰레드가 클라 요청을 받아서
작업중인 JobQueue에 다른 일감을 Push할 수도 있습니다.
따라서 나만 Flush한다고 안심한다고 그냥 Pop하면 안되고
lock을 걸어서 안전하게 데이터를 꺼내야 합니다.

0

조영웅

lock 부분을 다시 복습해 보니,

말씀하신대로 'Lock을 걸어서 안전하게 데이터를 꺼내야 한다' 라는 말이

멀티스레드에서 생기는 '경합 조건', '메모리 베리어 가시성' 같은 문제를 방지하기 위해

여러 스레드가 동시에 접근할 수 있는 곳은 '원자적' 으로 로직이 작동할 수 있도록 한다는 말인가요?

0

Rookiss

로직이 원자적으로 작동하는 것은 아니고 경합에 대한 얘기입니다.
(애당초 그렇게 큰 덩어리의 코드가 모두 원자적으로 동작할 순 없습니다.)
일반 자료구조 Container들은 멀티쓰레드 환경에 안전하게 동작하지 않습니다.
\

연결 리스트를 생각해서 예를 들어보면,
A와 B 쓰레드가 동시에 Add를 해서 데이터를 밀어 넣으면, 결과는 어떻게 되어야 할까요?
마지막 노드를 기반으로 A와 B가 각각 자신이 신규 데이터라고 우기는 상황인데
당연히 둘 중 하나는 정상적으로 삽입이 되지 않고 분실되겠죠.
따라서 애초부터 Concurrency를 염두에 두고 만든 자료구조가 아닌 이상
무조건 데이터 Write는 한 번에 한 쓰레드만 해야 합니다.

0

조영웅

제가 너무 복잡하게 생각했네요. 감사합니다! 

TLS 질문드립니다.

0

35

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

39

2

Unity Span

0

66

2

XML, Dll 차이점

0

99

2

Session 질문입니다

0

74

1

Write Read 커서 키워드

0

69

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

65

2

네트워크 Send 전담 스레드 배치

0

94

2

UnhandledException 으로 서버 터지는 경우

0

82

2

컨텐츠 단, 엔진 단

0

100

1

질문 있습니다

0

73

2

C# 게임서버 3D MMORPG

0

141

2

유니티6 버전

0

94

2

receive하는 부분과 send하는 부분의 차이

0

128

2

커서의 위치의 중요성

0

99

2

C++ 전혀 모르는데 C# 서버

0

164

2

강의에 질문이 있습니다

0

83

2

멀티스레드 이해도 질문

0

90

1

500 vs 500

0

122

3

OnAcceptHandler 액션 함수

0

57

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

185

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

78

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

100

1

스핀락 질문.

0

104

2