[WinAPI] GetCurrentThreadId, 쓰레드 식별자

[WinAPI] GetCurrentThreadId, 쓰레드 식별자

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 );

아래 그림과 같이 로그는 찍지만 … 정확히 어떤 쓰레드인지 구분이 잘 안됩니다.

이런 경우 아래와 같이 코드를 짜게 되면

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;
}

아래와 같이 쓰레드 식별자를 구분하여 더 정확한 분석을 할 수 있게됩니다.

빨간 밑줄은 3B10 식별자를 가진 쓰레드만 체크한 것입니다. 보시면 1씩 정상적으로 증가한 것을 확인할 수 있습니다.