CreateThread

간단하게 쓰레드를 만들고 쓰레드를 강제 종료 시킬수 있는 방법에 대해서 알아보자.

쓰레드 생성, 함수, 종료, 해제로 나눠서 이야기 해보자.

< 쓰레드 생성 >

threadHandle[n] = CreateThread( NULL, stackSize, TestThread,
                           &threadSt[n], CREATE_SUSPENDED, &(threadSt[n].id) );

HANDLE CreateThread(
     LPSECURITY_ATTRIBUTES lpThreadAttributes,  //생성 하는 보안 관련 속성
     SIZE_T dwStackSize,    //스레드의 스택 크기 지정, 0( 또는 NULL)이면 디폴트로 1mb
     LPTHREAD_START_ROUTINE lpStartAddress,   //쓰레드 함수
     LPVOID lpParameter,  //쓰레드 함수로 넘기 인자들
     DWORD dwCreationFlags,   //0이면 쓰레드 바로 시작
                                         //CREATE_SUSPENDED이면 ResumeThread( )에 의해 시작
     LPDWORD lpThreadId  )    //쓰레드 ID를 얻어 올수 있음, 필요 없다면 NULL

리턴값 : 쓰레드 핸들

< 쓰레드 함수 >

DWORD WINAPI TestThread( LPVOID lpParam )

{

    ThreadStruct *threadSt = (ThreadStruct*)lpParam;

 

    char  str[300];

    for( int  n = 0; ; ++n )

    {

        sprintf_s( str, 300, "ID: %d %d %s\n", threadSt->id, n, threadSt->msg );

        OutputDebugString( str );   

        Sleep( 1 );

 

        if( WaitForSingleObject( g_hStopEvent, 0 ) == WAIT_OBJECT_0 )

            break;

    }

 

    return 0;

}

DWORD (WINAPI *PTHREAD_START_ROUTINE) (LPVOID lpThreadParameter)
     LPVOID lpThreadParameter  //쓰레드 함수로 넘기 인자들
                                          //CreateThread의 lpParameter에서 넘어온 인자이다.

< 쓰레드 종료 >

    //쓰레드를 종료하기 위한 이벤트

    HANDLE g_hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

쓰레드를 무한 루프 함수로 만들어 놓고, 함수를 끝낼려고 하면 메인 쓰레드에서 SetEvent를 실행한다.

    SetEvent( g_hStopEvent );

쓰레드 함수에서는 WaitForSingleObject( )의 리턴값이

DWORD WINAPI TestThread( LPVOID lpParam )

{

    ..........

    for( int  n = 0; ; ++n )

    {

        ..........

        if( WaitForSingleObject( g_hStopEvent, 0 ) == WAIT_OBJECT_0 )

            break;

        ..........

    }

    ..........

}

< 쓰레드 해제 >

사용한 쓰레드 핸들과 종료 이벤트 핸들을 해제한다.

    //사용한 핸들을 해제한다.

    for( int n = 0; n < MAX_THREAD_NUM;    ++n )

    {

        CloseHandle( threadHandle[n] );

    }

    CloseHandle( g_hStopEvent );

전체 테스트 소스 : thread_demo.cpp