본문 바로가기
■ 프로그래밍, 개발

쓰레드의 진실 - CreateThread,_beginthread,_beginthreadex,AfxBeginThread

by 토크맨 2014. 2. 18.
반응형

# Thread (쓰레드) 의 진실

 

   프로그래밍을 하다보면 쓰레드를 많이 사용하게 된다. 하지만 쓰레드는 굉장히 위험한 엔진?이므로 

   잘 돌려야 한다. 

     대부분 쓰레드를 생성할때 사용할 수 있는 함수들이 

     CreateThread 함수, _beginthread 함수, _beginthreadex 함수, AfxBeginThread 함수  

     이렇게 4가지 정도 사용되어지는데..

 

     * CreateThread 함수 

        : 쓰레드 생성 함수  (사용자제요망)

          C/C++ 표준함수를 호출하려하면 문제가 발생할 수 있음. 

 

     * _beginthread 함수 

        : C/C++ 표준함수가 안전하게 실행되어질 수 있다.

          하지만 생성시 반환되는 핸들을 무효화시켜 커널 오브젝트에 접근할 수 있는 방법을 

          막아버리는 문제점이 있다. 

 

     * _beginthreadex 함수 

        : C/C++ 표준함수가 안전하게 실행되어질 수 있다.  (사용권장) 

          마지막엔 CloseHandle 로 핸들을 닫아 주어야 한다.

           _beginthread 함수를 개선시킨 함수이다. 

             

 

     * AfxBeginThread 함수 

        : MFC 에서 제공되어지는 클래스/함수 등을 사용할 때에는 특히 UI 관련된 작업을 할때에는 

           반드시 AfxBeginThread 함수로 쓰레드를 생성하여야 함.  (사용권장) 

           내부적으로는 _beginthreadex 함수가 사용되어진다.

 

 

 

-------------------------------------------------------------------------------------------------

// _beginthreadex 예제

 

    #include <process.h>

 

   {

      HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, threadFunc, NULL, CREATE_SUSPENDED, NULL);

       if (!hThread)

      {

   TRACE(" Error Thread \r\n");

   return;

      }

      ResumeThread(hThread);

      SuspendThread(hThread);

      ResumeThread(hThread);

      WaitForSingleObject(hThread, INFINITE);

      CloseHandle(hThread);

   }

 

   unsigned __stdcall threadFunc( void* pArguments )

   {

      ...

      return 0;

   }

-------------------------------------------------------------------------------------------------

 

-------------------------------------------------------------------------------------------------

// AfxBeginThread 예제

 

   #include <afxwin.h>

 

   CWinThread *pThread = AfxBeginThread(funcThread, NULL);

      

   static UINT funcThread(LPVOID pParam);

   UINT CT_ThreadAfxDlg::funcThread(LPVOID pParam)

   {

TRACE(" THREAD \r\n");

return 0;

   }

-------------------------------------------------------------------------------------------------

 

 

 

 

 

 

반응형

댓글