채널톡 아이콘

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

박건우님의 프로필 이미지

작성한 질문수

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

DeadLock 탐지

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

작성

·

23

0

#include "pch.h"
#include "AccountManager.h"
#include "PlayerManager.h"

AccountManager GAccountManager;

void AccountManager::AccountThenPlayer()
{
	WRITE_LOCK;
	//GPlayerManager.Lock();
}

void AccountManager::Lock()
{
	WRITE_LOCK;
}
#include "pch.h"
#include "PlayerManager.h"
#include "AccountManager.h"

PlayerManager GPlayerManager;
void PlayerManager::PlayerThenAccount()
{
	WRITE_LOCK;
	//GAccountManager.Lock();
}

void PlayerManager::Lock()
{
	WRITE_LOCK;
}
int main() {

	for (int32 i = 0; i < 1; ++i) {
		GThreadManager->Launch([=] {
			while (true) {
				cout << "PlayerThenAccount" << endl;
				GPlayerManager.PlayerThenAccount();
				this_thread::sleep_for(100ms);
			}
			});
	}

	for (int32 i = 0; i < 1; ++i) {
		GThreadManager->Launch([=] {
			while (true) {
				cout << "AccountThenPlayer" << endl;
				GAccountManager.AccountThenPlayer();
				this_thread::sleep_for(100ms);
			}
			});
	}

	GThreadManager->Join();

	
	return 0;

}

위에처럼 AccountManager에서 PlayerManager의 lock을 잡는 코드를 주석처리하였고 반대도 마찬가지로 주석처리 하였는대도, debug모드시 deadLock으로 처리가 되는데, 원래 이렇게 떠야하는게 맞는건가요? 이거는 데드락 상황이 아니지 않나요?

답변 2

0

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

네 주석 처리하셨으면 데드락으로 안 떠야 정상인데요.
제 환경에선 안 뜨는 것을 확인했고요.
정말 주석처리하고 실행해도 그렇단 말인가요? ServerCore 다시 빌드를 해보시겠어요?
그래도 발생한다면 데드락으로 탐지하는 부분에서 콜스택을 확인해서 왜 그렇게 잡혔는지를 분석해주세요.

0

인프런 AI 인턴님의 프로필 이미지

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

현재 작성하신 코드는 WRITE_LOCK을 사용하여 AccountManager와 PlayerManager 각각의 메서드를 잠그고 있습니다. 코드 자체로는 두 객체가 서로 다른 WRITE_LOCK을 걸고 있어 독립적으로 보호되는 것처럼 보일 수 있습니다. 그러나, 일반적으로 데드락은 두 개 이상의 스레드가 두 개의 리소스를 서로 락을 걸고 풀지 않는 상황에서 발생하게 됩니다.

아래는 이해에 도움이 될 수 있는 참고 URL입니다:
- 데드락 이해하기 - 데드락의 기초 개념과 lock_guard의 동작 방식을 설명한 답변입니다.
- 데드락의 발생 조건 - 데드락을 피하기 위한 다양한 전략을 소개한 답변입니다.

디버그 모드에서 데드락으로 인식되는 이유는 다양한 요인에 의해 좌우될 수 있습니다:
1. WRITE_LOCK 매크로가 어떠한 행위를 하는가에 따라 다르게 적용될 수 있습니다. 여러 스레드가 동일한 리소스를 독점하려 한다면 데드락으로 이어질 수 있습니다.
2. Launch 함수는 아마도 멀티스레딩 컨텍스트를 제공하고 있으며, 각 스레드가 특정 시점에서 멈춰서게 될 경우 데드락 감지가 가능한 구조일 수 있습니다.

WRITE_LOCK의 구체적인 구현이 중요한데요, 이 부분이 각 클래스 내에서 어떻게 정의되고 실행되는지 확인해보는 것이 좋습니다. 또한, 스레드 관리 및 실행의 디테일한 부분도 중요하니 여러 자료를 참고하여 스레드 동작을 살펴보시길 권장합니다.

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