본문 바로가기
개발/Windows

MFC AfxBeginThread 사용시 주의: m_bAutoDelete

by lucidmaj7 2020. 1. 30.
728x90
반응형

AfxBeginThread

AfxBeginThread는 MFC프로그래밍에서 다중 쓰레드를 생성할 수 있게 해준다. 특히 AfxBeginThread는 객체 하나를 리턴하게 되는데 CWinThread의 인스턴스 리턴하게 된다. 이때 용도에 따라 UI Thread, Worker Thread 로 사용할 수 있다.

CWinThread::m_bAutoDelete

AfxBeginThread로 생성한 CWinThread 인스턴스는 쓰레드 종료시 주의할 점이 있는데 바로 종료시 자동으로 삭제된다는 점이다. CWinThread의 맴버 변수에는 m_bAutoDelete가 존재하는데 기본적으로 TRUE로 설정 되어있다. 쓰레드 종료시 자동으로 객체를 삭제할지를 설정하는 변수이다.
쓰레드를 종료하고나서 쓰레드의 종료코드를 구한다던지, 종료할 쓰레드를 핸들을 가지고 기다린다던지 해야할 때 필요한게 쓰레드 핸들이다. CWinThreadm_hThread에 핸들이 저장되어있는데 종료시 객체가 삭제되니 접근하기 어려워진다. 이러한 경우 MSDN에서는 아래와 같이 사용 하라고 권장 하고 있다.(https://docs.microsoft.com/ko-kr/cpp/parallel/multithreading-terminating-threads?view=vs-2019)

 

 

  • m_bAutoDelete 데이터 멤버를 FALSE로 설정 합니다. 이렇게 하면 스레드가 CWinThread 종료 된 후에도 개체를 계속 사용할 수 있습니다. 그런 다음 스레드가 종료 된 m_hThread 후에 데이터 멤버에 액세스할 수 있습니다. 그러나이 방법을 사용 하는 경우 프레임 워크에서 자동으로 삭제 하지 CWinThread 않으므로 개체를 소멸 해야 합니다. 이것은 기본적으로 사용되는 방법입니다.

  • 스레드의 핸들을 별도로 저장 합니다. 스레드를 만든 후에는를 사용 m_hThread 하 여 ::DuplicateHandle데이터 멤버를 다른 변수에 복사 하 고 해당 변수를 통해 액세스 합니다. 이러한 방식으로 종료가 발생 하면 개체가 자동으로 삭제 되 고 스레드가 종료 된 이유를 확인할 수 있습니다. 핸들을 복제 하려면 스레드가 종료 되지 않도록 주의 해야 합니다. 이 작업을 수행 하는 가장 안전한 방법은 AfxBeginThread에 CREATE_SUSPENDED를 전달 하 고, 핸들을 저장 한 다음 ResumeThread를 호출 하 여 스레드를 다시 시작 하는 것입니다.

정리를 하자면 쓰레드를CREATE_SUSPEND상태로 생성, m_bAutoDeleteTRUE로 설정하고 ResumeThread로 설정하여 실행하거나 핸들을 복사하여 쓰레드핸들을 별도로 저장해 놓으라는 것이다. 이렇게 m_bAutoDelete = TRUE로 설정하 경우 CWinThread객체를 별도로 소멸시켜줘야 한다.



예시 코드

    g_pThread = AfxBeginThread(ThreadTest, this,0,0,CREATE_SUSPENDED,0);
    g_pThread->m_bAutoDelete = FALSE;
    g_pThread->ResumeThread();
    AfxMessageBox(_T("Thread is Started."));
    WaitForSingleObject(g_pThread->m_hThread, 2000);
    delete g_pThread;
    g_pThread = NULL;
728x90
반응형

댓글