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

starkshn님의 프로필 이미지
starkshn

작성한 질문수

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

JobQueue #1

12분 40초 질문

작성

·

181

0

 

1. A라는 쓰레드가 Push에서 락을 잡는다.(다른애가 Push를 못하는 상황) 

그리고 _jobQueue에다가 일감을 밀어 넣는다.

 

2. lock 안에서 flush가 true로 바뀌어서 Flush함수로 간다.

 

 

3. A쓰레드는 Flush함수에 들어와서 while문안에서 Pop을 한다.

 

 

4. Flush에서 Pop을 하는 순간 A는 락을 잡고 "_jobQueue.Count == 0" 이 될때까지

retrun _jobQueue.Dequeue();를 하면서 Flush의 while문을 돌게된다.

*********

 

<질문>

 

 

A라는 쓰레드가 Push에 와서 최초의 _flush를 true로 바꾸어 주어서

모든 쓰레드들이 접근이 가능한 _flush는 true인 상태여서

A가 Flush함수를 실행하러 계속 안에 있고

 

다른 B라는 쓰레드가 Push에와서 락을 잡고 일감을 밀어 넣는다고 해도 

_flush는 true라서 

Push안의 flush를 true로 바꿀 수 없어서 

if (flush)에 조건이 안맞아 락만 걸고 일감을 밀어넣고 나오고

 

A만 Flush를 실행할 수 있고 A만 Flush함수에 계속 상주해 있고

 

다른애들이 계속 일감만 밀어 넣어주는 방식인가요??

 

Pop에서 락을 건 이유는 그냥 데이터를 안전하게 꺼내기 위함이고...

 

이렇게 이해했는데 맞을까요??

 

 

 

 

 

답변 1

0

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

말 그대로 딱 1개의 쓰레드만 실행을 담당하게 하기 위함입니다.

starkshn님의 프로필 이미지
starkshn

작성한 질문수

질문하기