1)윈도우 스레드

- 스레드 생성하기

윈도우에서 스레드를 구동시키기 위해서는 Win32 API인 CreateThread 함수를 사용하면 된다. 이 함수는 윈도우에서 사용하는 가장 저수준의 스레드 구동 함수다.

함수의 원형은 다음과 같다.

CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,                      //Security Descriptor

SIZE_T dwStackSize,                                            //초기 스택 크기

LPTHREAD_START_ROUTINE lpStartAddress,                         //스레드 함수

LPVOID lpParameter,                                            //스레드 인자

DWORD dwCreationFlags,                                         //생성 옵션

LPDWORD lpThreadId                                             //스레드 아이디

);

첫 번째 인자생성될 스레드에 대한 사용권한을 지정하는데 사용하며 보통 NULL로 설정하게 되고 이는 THREAD_ALL_ACCESS를 의미하므로 어떤 함수든 이 스레드의 핸들을 이용해서 스레드를 제어할수 있다.

 

두 번째 인자스택 크기는 생성되는 스레드의 스택 크기를 정하는 인자며 만약 0으로 주게 되면 기본 값으로 1MByte의 스택이 생성된다.

 

세 번째 인자lpStartAddress는 생성된 스레드가 실행시킬 함수며 함수의 원형은 아래와 같다.

DWORD WINAPI ThreadFunc(LPVOID lpParam)

 

네 번째 인자스레드로 실행 시킬 함수의 인자값이며 인자로 포이트 포인트가 필요한 이유는 인자의 수와 자료형을 알수 없기 때문이다.

 

다섯 번째 인자스레드 생성 옵션에 해당하며 이 인자에 0을 주면스레드가 생성된 후 스레드가 바로 동작하는 것을 으미한다. 반면 CREATE_SUSPENDED를 인자로 주면 스레드가 멈춰있는 상태로 생성되는 것을 의미한다. 만약 스레드가 Suspend, 즉 몀춰있는 상태라면 ResumeThread 함수를 통해서 실행 가능한 상태를 의미하는 동작대기(Ready)상태로 바꿀수 있다.

 

마지막 인자인 여섯 번째 인자생성된 스레드의 스레드 아이디 값을 받는 인자다.

 

 

- 스레드 생성예(스레드 생성 버튼 클릭시 스레드를 생성하는 예이다)

 

DWORD WINAPI ThreadFunc(LPVOID lpParam)   //스레드로 생성될 함수 원형은 정해진 틀에 맞게 만들어 줘야한다.

{

   AfxMessageBox(L"나는 스레드~");

   return 0;

}

void CUdpMfcDlg::OnBnClickedThread()                                  //버튼 클릭시 호출되는 함수로 스레드를 생성하게 된다.

{

    DWORD dwThreadID;                                                      //생성될 스레드의 아이디를 받을 변수다

    HANDLE hThread;                                                        //생성될 스레드의 핸들러를 받을 변수다.

    int i; //카운터로 사용할 변수

    for (i=0;5>i;++i)                                                      // 5개의 스레드를 생성하기 위해 반복문을 돌린다.

    {

       // CreateThread 함수의 인자는 (스레드사용권한,스택크기,호출함수,함수인자,생성옵션,생성된아이디) 며

       // 생성된 스레드의 핸들러를 반환한다.

         hThread = CreateThread( NULL , 0 , ThreadFunc , 0 , 0 , &dwThreadID ); //스레드 생성 함수를 호출

    }

    if (hThread == NULL)                                             //핸들러가 비어 있다면 스레드 생성에 실패 한 것이다.

    {

         AfxMessageBox(L"스레드 생성 실패!!");

    }

    else

    {

        AfxMessageBox(L"스레드 생성 성공");

        CloseHandle(hThread);                                   //스레드 핸들은 CloseHandle을 사용해서 해제 해주어야 한다.

    }

}

 

- 스레드 제어/종료

생성된 스레드 내에서 자신의 핸들을 얻고 싶을 때는 아래 함수를 사용해서 얻어낼수 있다.

HANDLE GetCurrentThread(VOID)

 

생성된 스레드 내에서 스레드를 끝내려 한다면 스레드 내에서 return해서 종료하거나 ExitThread()를 사용해서 종료 시킬수 있다.

VOID ExitThread(DWORD dwExitCode)

스레드를 생성 하게 되면 윈도우는 각 스레드를 관리하는 스레드 객체를 커널에서 마련해서 관리하게 된다. 그리고 스레드가 시작되면 스레드 객체의 스레드의 종료 살태 코드는 STILL_ACTIVE를 갖게 된다. 그렇지만 스레드가 종료되면 스레드 객체는 시그널(종료)된 상태가 되고 스레드의 종료 상태 코드는 ExitThread 함수 호출시 지정한 dwExitCode로 바뀌게 된다.

 
Posted by 응이

Dream come true.
응이

달력

태그목록