inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

DeadLock 탐지

오늘 강의중에서 이해가 안되는 부분이 있습니다.

136

작성자 없음

작성한 질문수 0

0

	//잡고 있는 락이 있다면
	if (_lockStack.empty() == false) {

		// 기존에 발견되지 않은 케이스라면 데드락 다시 확인
		const int32 prevId = _lockStack.top();
		if (lockId != prevId) { // 재귀호출은 deadLock이 아님 싸이클 확인할 필요 없음
			set<int32>& history = _lockHistory[prevId];
			if (history.find(lockId) == history.end()) {
				history.insert(lockId);
				CheckCycle();
			}
		}
	}

위의 코드는 쓰레드 1이 lock a를 먼저 잡고 쓰레드 2가 lock b를 잡으면 a의 history에 b가 들어가게 되지않나요? 제가 생각한 history는 쓰레드 1이 lock a를 잡은상태에서 lock b까지 잡으려고 할 때 a의 history에 b가 들어간다고 이해하고 있었는데, 제가 어떤걸 놓치고 있는지 잘 모르겠습니다.

네트워크 MMORPG windows-server

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 박건우님.

질문해 주신 부분에 대해 설명드리자면, 위의 코드는 데드락 탐지를 위한 코드로 보입니다. 이해를 돕기 위해서 코드의 주요 개념과 동작을 요약하겠습니다.

  • _lockStack은 현재 스레드가 잡고 있는 락들의 스택입니다. 가장 최근에 잡은 락이 스택의 최상단에 위치해 있습니다.
  • lockId는 현재 잡으려는 락의 ID입니다.
  • prevId는 이미 잡혀 있는 가장 최근의 락 ID를 나타냅니다.
  • historyprevId에 대한 락 의존성을 기록하는 구조입니다. 즉, 하나의 락을 잡은 후 다른 락을 잡으려 한다면, 그 기록을 남기는 곳입니다.

질문에서 착각한 부분은 “쓰레드 1이 lock a를 잡고 있는 상태에서 lock b를 잡으려고 할 때”입니다. 이때, 락 a의 후속 락으로 b가 기록되어야 합니다. 데드락 탐지는 이와 같은 락 획득 순서를 추적하여 싸이클이 생기는지를 확인하는 것입니다.

기본적으로 데드락 문제를 피하기 위해서는 두 가지 이상의 스레드가 동일한 락을 다른 순서로 잡는 경우를 방지해야 합니다. CheckCycle() 함수는 이러한 싸이클을 검사하여 데드락이 발생할 가능성을 판단합니다.

관련 질문 및 추가 정보
- 데드락 탐지에 관해 질문드립니다!
- 데드락 탐지에서 강의 극후반에 LLockStack 관련한 질문입니다!

이 링크들은 데드락 탐지에 관련된 추가적인 설명과 사례를 제공하니 참고하시기를 권장드립니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

0

61

2

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

0

109

1

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

0

59

1

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

0

80

2

성능 테스트 결과

0

101

2

게임 서버 Stateful, Stateless 진로 고민

0

118

1

WaitOnAddress와 Sleep의 차이 질문

0

81

1

궁금한거 있습니다.

0

79

2

JobTimer 구동 스레드

0

105

2

TryPop() 동작 관련 질문

0

79

1

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

0

145

2

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

0

71

1

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

0

83

2

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

0

138

2

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

0

99

2

mutex와 sleep 차이점

0

115

1

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

0

150

2

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

0

94

1

공부법 관련해서

0

181

2

MakeShared 함수 관련

0

112

1

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

0

142

2

운영체제관련 질문입니다

0

129

1

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

0

115

2

메모리 풀 질문있습니다.

0

121

1