pthread에서 쓰레드 ID를 가져올때..

la9527의 이미지

우선 코드부터 보시고 말씀 드리겠습니다.

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시간 돌고 나믄.. 그냥 뻗어 버리니. 원.~ ^^;;

그럼 답변 기다리겠습니다.
읽어 보신 분들에게 우선 감사 드립니다. ^^

amister의 이미지

detached로 thread 만드셨는지요?
그렇지 않다면, thread를 create한 쪽에서 pthread_join()을 해줘야 합니다.

pthread_create(), pthread_join(), pthread_detach() 등을 참고하시면 쉽게 해결하실 수 있습니다.

la9527의 이미지

우선 답변 감사합니다.

혹시 detached 를 않하면 이렇게 되나여?
무슨 이유인지는 잘 모르겠습니다. (무지해서 ^^;)

그리고 한가지 더. 님이 말씀하신대로 detached를 하고..
한 10000번 이상씩 돌면 메모리를 거의 100MB 잡아먹는데..
제가 메모리 free는 제대로 해줬거든여.. 그냥 돌긴 잘돌아여... ^^;;
10만번 돌면 시스템 가더군여. ^^;

무슨 문제인지 모르겠습니다..

morison77의 이미지

thread를 생성하고 이를 join해주지 않으면 thread가 사용하던 자원은
그대로 남아 있게 됩니다. 이를 회수하려면 pthread_join이라는 방법이
있을수 있겠지만

pthread_detach를 사용하여 thread를 분리 시키는 방법도 있습니다.
이때 얻을수 있는 이익은 detach시킨 thread가 언제 종료되었는지
알 필요 없고 thread가 종료시 알아서 자원이 반환된다는 것입니다.

그러면 도움이 되셨기를..

p.s
pthread_join을 하지 않아 회수 못한 thread들의 자원들이
아마도 la9527님께서 만드신 프로그램이 죽는이유중 하나가 아닌가 싶습니다.

light my fire

la9527의 이미지

답변 감사 드립니다.

해결 했습니다.
자원 반환을 않한게 에러의 원인이더군요..
또한가지 delete하나 빼먹었더군요. ^^;;

답변해주신 분들에게 감사드립니다. ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.