pthread에서 쓰레드 ID를 가져올때..
글쓴이: la9527 / 작성시간: 월, 2003/10/06 - 6:38오후
우선 코드부터 보시고 말씀 드리겠습니다.
int Thread::Start(void* pArg) { int nResult; m_pArg = pArg; nResult = pthread_create(&m_tHandle, &m_tAttr, Thread::EntryPoint, this); return nResult; } int Thread::Run(void* pArg) { m_bRun = PTHREAD_RUNNING; Execute(pArg); m_bRun = PTHREAD_END; return SUCCESS; } void* Thread::EntryPoint(void* pThis) { Thread* pThread = (Thread*)pThis; cout<<"Thread::EntryPoint"<<endl); cout << "Thread::Execute Start :: ID :: " << pthread_self() << endl; pThread->Run((void*)(*pThread)); cout << "Thread::Execute End :: ID :: " << pthread_self() << endl; cout << "Thread::Thread Exit" << endl; pthread_exit(NULL); return NULL; } void Thread::Execute(void* pArg) { cout<<"Thread::Execute"<<endl; }
이런 식으로 쓰레드 프로그램을 만들때, pthread_self() 하면 쓰레드 ID가 나오게 되는데,
이 CLASS를 new로 해서 만든다음 delete 시켜도 pthread_self()의 값은 계속 증가하고, 끝에 가서는(1520번 정도 돌고) 프로세스가 그냥 멈춰 버리게 됩니다.
한데 쓰레드 ID를 보니 계속 증가하다가(12301241)
처음으로 다시 돌아가는 때 (16030)에 멈추는데,
제가 보기에는 쓰레드 id가 계속 증가하면 않될것 같은데..
그것이 문제인지.. 코딩이 잘못된 건지.. 아무튼 이것 땜에 몇일 동안 고생입니다.
프로그램이 한 24시간 돌고 나믄.. 그냥 뻗어 버리니. 원.~ ^^;;
그럼 답변 기다리겠습니다.
읽어 보신 분들에게 우선 감사 드립니다. ^^
Forums:
detached로 thread 만드셨는지요?그렇지 않다면, threa
detached로 thread 만드셨는지요?
그렇지 않다면, thread를 create한 쪽에서 pthread_join()을 해줘야 합니다.
pthread_create(), pthread_join(), pthread_detach() 등을 참고하시면 쉽게 해결하실 수 있습니다.
우선 답변 감사합니다.혹시 detached 를 않하면 이렇게 되나
우선 답변 감사합니다.
혹시 detached 를 않하면 이렇게 되나여?
무슨 이유인지는 잘 모르겠습니다. (무지해서 ^^;)
그리고 한가지 더. 님이 말씀하신대로 detached를 하고..
한 10000번 이상씩 돌면 메모리를 거의 100MB 잡아먹는데..
제가 메모리 free는 제대로 해줬거든여.. 그냥 돌긴 잘돌아여... ^^;;
10만번 돌면 시스템 가더군여. ^^;
무슨 문제인지 모르겠습니다..
https://github.com/la9527
thread를 생성하고 이를 join해주지 않으면 thread가 사용하던
thread를 생성하고 이를 join해주지 않으면 thread가 사용하던 자원은
그대로 남아 있게 됩니다. 이를 회수하려면 pthread_join이라는 방법이
있을수 있겠지만
pthread_detach를 사용하여 thread를 분리 시키는 방법도 있습니다.
이때 얻을수 있는 이익은 detach시킨 thread가 언제 종료되었는지
알 필요 없고 thread가 종료시 알아서 자원이 반환된다는 것입니다.
그러면 도움이 되셨기를..
p.s
pthread_join을 하지 않아 회수 못한 thread들의 자원들이
아마도 la9527님께서 만드신 프로그램이 죽는이유중 하나가 아닌가 싶습니다.
light my fire
답변 감사드립니다.
답변 감사 드립니다.
해결 했습니다.
자원 반환을 않한게 에러의 원인이더군요..
또한가지 delete하나 빼먹었더군요. ^^;;
답변해주신 분들에게 감사드립니다. ^^
https://github.com/la9527
댓글 달기