inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Condition Variable 질문입니다.

184

snu

작성한 질문수 34

0

//Producer

while(true)

{

{

unique_lock<mutex> lock(m);

q.push(100);

}

cv.notify_one();

}

 

//Consumer

while(true)

{

unique_lock<mutex> lock(m);

cv.wait(lock,[](){return q.empty()==false;});

{

int32 data = q.front();

q.pop();

cout<<data<<endl;

}

}

 

1. Producer에서 cv.notify_one(); 을 한 뒤 Consumer의 cv.wait가 깨어나기 전에 Producer가 unique_lock<mutex> lock(m); 을 걸면 pop을 하지 못하고 queue에 데이터가 연속으로 쌓이는 경우가 있나요?

 

2. 디버깅을 찍어보니 cv.wait가 처음 수행되었을 때는 cv.notify_one() 없이도 그냥 깨어나던데 cv.wait는 notify를 해줬을 경우만 깨어나지 않나요?

ex) 스레드 Producer, Consumer을 모두 실행 직후 최초 q.push 이후 notify_one 없이 wait가 깨어나 data를 cout 함.

 

3. notify_one 해줬을 때 cv.wait의 [](){return q.empty()==false;} 조건이 충족되지 않았을 때 대기를 하는데(queue에 아무것도 없는 상태)

이때, queue 에 push를 해주면 별도의 반복 notify_one 작업 없이 바로 깨어나나요? 

디버깅을 해보니 notify_one을 걸고 조건 실패하여 대기중일때 queue에 push를 해주니 꺠어나는것 같았습니다.

notify_one은 1회성으로 바로 리턴하고 끝인줄 알았는데 Count가 하나 증가하여 queue에 data가 쌓일때까지 대기하는? 개념인지 궁금합니다.

network MMORPG windows-server

답변 1

1

Rookiss

1. 네 그렇습니다.
2. 꼭 그렇진 않고, 구조상 깨어나서 허탕칠 가능성도 있습니다. 이를 전문적으로 spurious wakeup이라고 합니다.

https://en.wikipedia.org/wiki/Spurious_wakeup

3. 그 정도로 스마트하게 동작하진 않구요. 깨어났을 때 허탕치고 다시 잠들면, 다시 깨워줘야 합니다.
물론 2번에서처럼 중간 중간에 자연스럽게(?) 잠에서 깨는 경우도 있으니
너무 완벽하게 구조를 이해하려 할 필요는 없습니다.

Memory Pool에서 오버플로우 질문입니다.

0

62

2

포토폴리오 및 진로 관련하여 고민입니다.

0

112

1

포토폴리오 관련 고민입니다.

0

61

1

실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.

0

82

2

성능 테스트 결과

0

103

2

게임 서버 Stateful, Stateless 진로 고민

0

121

1

WaitOnAddress와 Sleep의 차이 질문

0

83

1

궁금한거 있습니다.

0

82

2

JobTimer 구동 스레드

0

107

2

TryPop() 동작 관련 질문

0

81

1

로드맵 C#서버 C++서버 방향성 질문

0

148

2

스레드 id를 출력할떄 메인스레드 id도 출력되나요?

0

73

1

생명주기를 위한 의도적 복사

0

86

2

락프리의 실무에서 사용 질문

0

139

2

32bit threadID와 16비트 상위 WriteFlag에 대해

0

101

2

mutex와 sleep 차이점

0

117

1

실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다

0

152

2

Stomp Allocator의 Release함수에 대한 질문입니다.

0

96

1

공부법 관련해서

0

183

2

MakeShared 함수 관련

0

114

1

지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.

0

144

2

운영체제관련 질문입니다

0

131

1

send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.

0

117

2

메모리 풀 질문있습니다.

0

123

1