|
이종빈 님이 쓰신 글 :
: thread를 생성해서 돌리다가 없애기위해서
:
: thread->Terminate();
: delete thread;
: thread = NULL;
:
: 이렇게 했습니다.
:
: 'delete thread;'를 하면 thread의 distructor가 호출되는데,
: 그 호출되는 시점이 thread의 Execute()가 종료된 다음에 호출이 되나요?
:
: 아님 Execute()가 종료하는 중간에 바로 distructor가 호출되나요?
: 호출되는 시점이 지 멋대루네요..
:
: 답변 부탁드립니다..
: 즐프하세요~~
:
다음과 같이 하세요.
thread->Terminate(); //thread->Terminated 에 true가 설정된다.
thread->WaitFor();
thread=NULL;
//----------------------
Execute()
{
while (!Terminated)
{
}
}
먼저 thread는 계속 while()사이를 배회하고 있습니다. 즉 쓰레드가 열심히 활동하고 있습니다.
그러던중 쓰레드를 종료하라는 메세지가 등장합니다.
즉 thread->Terminate(); 이게 그거죠.
근데 Terminate()한다고 해서 바로 끝나는게 아닙니다.
while (!Terminated)
{
a;
b;
c;
d;
e;
}
위에서 c줄을 실행하고 있는 시점에 있을때 thread->Terminate()가 호출되었다고 한다면
d,e줄을 실행시키고 난 다음 Terminated == true로 되어 while문을 빠져 나가게 되는 것입니다.
그리고 쓰레드의 작동이 끝나게 됩니다. 아직은 쓰레드에 할당된 메모리가 제거 되어 있지는 않습니다.
따라서 thread->Terminate()한다음 delete가 바로 오면 자주 다운되는 현상을 경험하실수가 있습니다.
while 사이에서 진행중일때 소멸을 시키기 때문이죠.
thread가 완전히 Terminate()되는 것을 기다리기위해서
thread->WaitFor() 쓰레드의 종료를 기다립니다.
그리고 delete thread;
메모리에 할당된 thread 객체를 삭제합니다.
ps. 틀린 부분이 있으면 정정 바랍니다.
저도 초짜라...자그나마 도움이 되길 바라며.
|