GetCurrentThreadID에 대해 알아보겠습니다.
프로그램을 개발하고 배포를 하면 개발자도 사람이다 보니 오류가 생기는 경우가 많이 있습니다.
유지보수 하는 것 또한 개발자가 해야할 일 인데, 이 경우 보통 로그를 분석하거나, Debug Output, TRACE를 사용하여 코드 분석을 많이 하게 됩니다.
이것은 매우 효율적인 방법이지만 GetCurrentThreadID를 사용하면 더욱 구별하기 쉬워집니다.
함수 원형은 아래와 같습니다.
DWORD GetCurrentThreadId();
매개변수는 없으며 반환값으로 쓰레드 식별자를 반환합니다.
예를들어 아래와 같은 쓰레드가 있다고 봅시다.
UINT CMFCApplication1Dlg::TestThread01( LPVOID lpVoid )
{
// TODO: 여기에 구현 코드 추가.
CMFCApplication1Dlg* pDlg = (CMFCApplication1Dlg*)lpVoid;
for ( int i = 0 ; i < 500 ; i++ )
{
TRACE( _T( "Test Thread %d\n" ), i );
}
return 0;
}
이 쓰레드를 한번만 호출할 땐 상관없지만 여러 번 호출하면 어떨까요?
AfxBeginThread( TestThread01, this );
AfxBeginThread( TestThread01, this );
AfxBeginThread( TestThread01, this );
AfxBeginThread( TestThread01, this );
아래 그림과 같이 로그는 찍지만 … 정확히 어떤 쓰레드인지 구분이 잘 안됩니다.
![](https://3001ssw.com/wp-content/uploads/2023/08/img-min-15.png)
이런 경우 아래와 같이 코드를 짜게 되면
UINT CMFCApplication1Dlg::TestThread01( LPVOID lpVoid )
{
// TODO: 여기에 구현 코드 추가.
CMFCApplication1Dlg* pDlg = (CMFCApplication1Dlg*)lpVoid;
DWORD dwThreadID = GetCurrentThreadId(); // 쓰레드 식별자 추가
for ( int i = 0 ; i < 500 ; i++ )
{
TRACE( _T( "%06X Thread : Test Thread %d\n" ), dwThreadID, i );
}
return 0;
}
아래와 같이 쓰레드 식별자를 구분하여 더 정확한 분석을 할 수 있게됩니다.
![](https://3001ssw.com/wp-content/uploads/2023/08/img_1-min-10.png)
빨간 밑줄은 3B10 식별자를 가진 쓰레드만 체크한 것입니다. 보시면 1씩 정상적으로 증가한 것을 확인할 수 있습니다.