inflearn logo
강의

講義

知識共有

C++とアンリアルで制作するMMORPGゲーム開発シリーズ Part4:ゲームサーバー

DeadLock検出

DeadLock 탐지에서 재귀 Lock 상황에 대해 궁금합니다.

127

hancheon

投稿した質問数 3

0

이전에 강의에서 만든 Lock은 같은 쓰레드가 재귀적으로 Lock을 잡을 수 있다고 기억합니다.

(아마 재귀 Lock의 상황을 제가 오해하고 있을 수도 있다고 생각합니다.)

오늘 만든 DeadLock Profiler대로면,

하나의 스레드가 A lock -> B lock -> A lock을 잡으려하면 DeadLock이 발생하는 것 같습니다.
제가 앞 강의의 RW SpinLock의 정책을 잘못 알고 있는걸까요?

항상 강의 잘보고 있습니다. 좋은 강의에 감사드려요!

네트워크 MMORPG windows-server

回答 2

0

Rookiss

A->B->A 는 원래 안 되는 것이 맞습니다.
되는 경우는 A->B->B->B->B 같은 경우입니다.

0

jeonkj0413

안녕하세요.
같은 질문에서 답변을 보고 또 궁금한 점이 생겨서 덧붙여 질문합니다.

A->B->A가 원래 안 된다는 이야기가 혹시 직접 구현한 Lock 에서 구조적으로 방지한다는 이야기인가요?

만약 그렇다면, 제가 봤을 때는 ReadLock의 경우 A->B->A도 가능해 보입니다. 어떻게 이를 안 되게 하고 있는 건지 궁금합니다.


좋은 강의 잘 보고 있습니다. 감사합니다!

void Lock::ReadLock(const char* name)
{
#if _DEBUG
	GDeadLockProfiler->PushLock(name);
#endif

	// 동일한 쓰레드가 소유하고 있다면 무조건 성공.
	const uint32 lockThreadId = (_lockFlag.load() & WRITE_THREAD_MASK) >> 16;
	if (LThreadId == lockThreadId)
	{
		_lockFlag.fetch_add(1);
		return;
	}

	// 아무도 소유하고 있지 않을 때 경합해서 공유 카운트를 올린다.
	const int64 beginTick = ::GetTickCount64();
	while (true)
	{
		for (uint32 spinCount = 0; spinCount < MAX_SPIN_COUNT; spinCount++)
		{
			uint32 expected = (_lockFlag.load() & READ_COUNT_MASK);
			if (_lockFlag.compare_exchange_strong(OUT expected, expected + 1))
				return;
		}

		if (::GetTickCount64() - beginTick >= ACQUIRE_TIMEOUT_TICK)
			CRASH("LOCK_TIMEOUT");

		this_thread::yield();
	}
}

0

Rookiss

READ_LOCK은 원래 제한이 없습니다.
여기서 A->B->A가 안 된다는 것은 WRITE_LOCK에 대한 얘기입니다!

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 한천님.

강의에서 제공되는 Lock 구조에서는, 동일한 스레드 내에서의 재귀적인 Lock 사용을 허용했을 가능성이 있습니다. 즉, 동일한 스레드가 여러 번 같은 Lock을 잡을 수 있도록 설정되어 있을 수 있습니다. 이는 보통 Recursive Lock 또는 재귀적인 락이라고 부릅니다.

하지만 DeadLock Profiler의 경우, 서로 다른 Lock 간의 의존성을 추적하며 Deadlock 여부를 탐지하게 됩니다. 이 경우 하나의 스레드가 A lock을 잡은 상태에서 다시 A lock을 잡으려고 하면, 스레드는 자기 자신에 의해 막히게 되어 Deadlock이 발생할 수 있다고 판단될 수 있습니다.

다음 링크에서 관련 내용을 더 깊게 확인하실 수 있습니다:

  • Deadlock detector 동작 방식 및 정책: 여기에서 Rookiss 강사님의 Deadlock 탐지 컨셉과 관련한 설명을 들어보실 수 있습니다. Deadlock이 어떻게 탐지되며, 왜 발생하는지를 이해하는 데 도움이 될 것입니다.

이외에 Deadlock을 포착하고 피할 수 있는 다양한 기법에 대해서도 학습을 해보시면 많은 도움이 될 것입니다.

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

IocpObject가 없어질 수 있는 이유에 대한 질문입니다.

0

111

2

CS 기초 지식이 필요없는 세상이 오지 않을까요?

0

217

2

LockFreeStack #2에서 ABA 문제

0

91

1

RefCounting 강의 질문있습니다.

0

115

2

writeLock을 잡을때 꼭 empty 상태여야하는 이유?

0

116

2

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

0

142

2

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

0

255

1

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

0

154

1

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

0

161

2

성능 테스트 결과

0

161

2

게임 서버 Stateful, Stateless 진로 고민

0

197

1

WaitOnAddress와 Sleep의 차이 질문

0

146

1

궁금한거 있습니다.

0

142

2

JobTimer 구동 스레드

0

161

2

TryPop() 동작 관련 질문

0

126

1

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

0

221

2

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

0

117

1

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

0

142

2

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

0

213

2

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

0

140

2

mutex와 sleep 차이점

0

171

1

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

0

210

2

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

0

142

1

공부법 관련해서

0

234

2