프로그래밍/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, 00);
    }
    ~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 이걸 이용해주는게 좋다고 합니다.

하지만 이걸 사용한 예제를 찾아볼 수가 없어서 어떤식으로 사용해야할지 감이 안잡히네요.....

오래된 기술이기도 하고 그러니 이런게 있구나.... 하고 넘어가면 좋을 것 같습니다.!!


반응형