프로그래밍/C++
C++] visual studio 에서 deadlock 상태 확인하기(CRITICAL_SECTION)
Hwan2
2020. 11. 5. 22:16
반응형
1. CRITICAL_SECTION
CRITICAL_SECTION 클래스는 <window.h> 에서 제공하는 MFC 라이브러리 기능입니다.
CRITICAL_SECTION 은 데드락이 발생했을시 디버깅을 통해서 쉽게 원인파악이 가능합니다.
2. 예제 코드
#include <iostream>
#include <thread>
#include <Windows.h>
using namespace std;
class CriticalSection
{
CRITICAL_SECTION m_critSec;
public:
CriticalSection() {
InitializeCriticalSectionEx(&m_critSec, 0, 0);
}
~CriticalSection() {
DeleteCriticalSection(&m_critSec);
}
void Lock() {
EnterCriticalSection(&m_critSec);
}
void Unlock() {
LeaveCriticalSection(&m_critSec);
}
};
int a;
CriticalSection a_mutex;
int b;
CriticalSection b_mutex;
int main()
{
// t1 스레드를 시작한다.
thread t1([]()
{
while (1)
{
a_mutex.Lock();
a++;
b_mutex.Lock();
b++;
cout << "t1 done.\n";
b_mutex.Unlock();
a_mutex.Unlock();
}
});
// t2 스레드를 시작한다.
thread t2([]()
{
while (1)
{
b_mutex.Lock();
b++;
a_mutex.Lock();
a++;
cout << "t2 done.\n";
a_mutex.Unlock();
b_mutex.Unlock();
}
});
t1.join();
t2.join();
return 0;
}
실행
실행하면 출력이 중간에 멈춤니다.
이를 디버깅 하기위해선 다음과 같이 진행하시면 됩니다.
3. 디버깅
1. 로컬 Windows 디버거 클릭.
2. 일시정지 아이콘 클릭
3. 디버그 -> 창 -> 스레드
4. CriticalSection 확인
4. 문제점
하지만 CRITICAL_SECTION은 반환값이 void 입니다.
따라서 InitializeCriticalSectionAndSpinCount 이걸 이용해주는게 좋다고 합니다.
하지만 이걸 사용한 예제를 찾아볼 수가 없어서 어떤식으로 사용해야할지 감이 안잡히네요.....
오래된 기술이기도 하고 그러니 이런게 있구나.... 하고 넘어가면 좋을 것 같습니다.!!
반응형