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

opcy02님의 프로필 이미지
opcy02

작성한 질문수

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

DeadLock 탐지

데드락 탐지

작성

·

554

0

데드락 탐지에 관련해서 궁금한게 있어서 질문드립니다.

아래의 코드로 lock_guard를 이용해서 데드락을 탐지 하려고하는데 데드락이 되는 상황이 발생하고, 탐지는 안되는 경우가 가끔 발생하네요...

DeadLockProfiler는 예제의 코드를 복사해서 사용했습니다.

#include "pch.h"

#include <iostream>

#include "DeadLockProfiler.h"


mutex lock1;
mutex lock2;

void Test();
void Test2();


void Test()
{
	DeadLockProfiler::GetInst()->PushLock("Test");

	lock_guard<mutex> gurad(lock1);
	Test2();

	DeadLockProfiler::GetInst()->PopLock("Test");
}

void Test2()
{
	DeadLockProfiler::GetInst()->PushLock("Test2");

	lock_guard<mutex> gurad(lock2);
	Test();

	DeadLockProfiler::GetInst()->PopLock("Test2");
}

int main()
{
	thread th1([=]
		{
			while (1)
			{
				cout << "test" << endl;
				Test();
				this_thread::sleep_for(100ms);
			}
		});
	thread th2([=]

		{
			while (1)
			{
				cout << "test2" << endl;
				Test2();
				this_thread::sleep_for(100ms);
			}
		});


	th1.join();
	th2.join();
	return 0;
}

답변 2

0

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

그리고 그 전에 애당초 코드가 좀 이상하네요.
Test->Test2->Test... 이렇게 호출하다 보면
무한 호출이 되면서 스택이 터질 것 같습니다.

표준 mutex는 recursive하게 락을 잡을 수도 없습니다. 이건 데드락과 별개의 상황이죠

opcy02님의 프로필 이미지
opcy02
질문자

이건 해당 파트와 별개의 질문인데 혹시 ARM CPU에서 IOCP Coding을 진행할 수 있는지 궁금합니다!

M1에서 가상환경을 통해 WIndows로 코딩하려고 하는데 IOCP가 정상적으로 돌아가는지가 궁금합니다.

0

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

DeadLock 탐지는 [가능성이 있었지만, 절묘하게 발생하지 않은] 애를 잡는 것이 포인트입니다.
(즉 순환 구조라 발생했는지를 탐지)
Profiler에 로그를 남기기도 전에 데드락이 발생해버리면 그것은 해결이 안됩니다.

opcy02님의 프로필 이미지
opcy02
질문자

아무리 생각해도 위에 코드에서는 로그를 남기기전에 데드락이 발생 안하는거 같은데...
잘모르겠네요..

opcy02님의 프로필 이미지
opcy02

작성한 질문수

질문하기