pthread 죽이는법?

cjy1126의 이미지

ping를 pthread로 작성하였습니다.

send와 receive 2개의 쓰레드가 있는데, send가 죽으면서 recvfrom중인 receive 쓰레드를 죽입니다.

문제는 지금까지 pthread_detach 로 죽이는줄알고 썼는데... ping을 여러번 반복하니까 한번보내고 for문에서 돌아가는 수만큼 받네요. -_-;

recvfrom 쓰레드가 계속 살아있어서 그런가 같은데, 어떻게 죽여야하나요?

폴링은 사용하면 안되고, 꼭 block이 되야하거든요.

답변 부탁드리겠습니다.

shkwon81의 이미지

Quote:
문제는 지금까지 pthread_detach 로 죽이는줄알고 썼는데... ping을 여러번 반복하니까 한번보내고 for문에서 돌아가는 수만큼 받네요. -_-;

정확한 상황은 모르겠습니다만,
pthread_detach 함수는 쓰레드를 죽이는 함수가 아니라 쓰레드를 분리시키는 함수입니다. 쓰레드를 "분리시킨다(detach)"는 의미는 해당 쓰레드가 종료되면 그 쓰레드에 사용된 자원은 곧바로 재활용된다는 것을 의미합니다.

다시 말하면, 나는 해당 쓰레드가 언제 종료되든 신경 쓰지 않을 것이고, 그 녀석이 종료될 때의 값을 받아오지 않을 테니까 죽으면 바로 자원을 반환하라는 뜻입니다.

이에 비해 디폴트 상태인 "Joinable(결합 가능)" 상태의 쓰레드는 반드시 pthread_join 함수를 호출하여 명시적으로 결합해야 합니다. 따라서 종료는 했지만, 아직 결합되지 않은 쓰레드는 아직 자원이 시스템으로 완전히 반환되지 않은 것이죠. (마치 좀비 프로세스와 유사합니다.)

결론적으로 어떤 쓰레드를 종료시키려면 pthread_cancel 함수를 사용하여 대상 쓰레드를 "취소"하는 방법을 사용하세요.. 또는 pthread_kill 함수를 사용하여 특정 쓰레드로 시그널을 보내는 방법도 생각할 수 있습니다. 가급적 cancel 메커니즘을 사용할 것을 추천합니다 ^^

pthread_cancel 에 대한 man page를 찾아 보시면 어느 정도 감이 오시지 않을까 합니다.

sylphong의 이미지

pthread_detach는 쓰레드를 죽이는게 아니라 쓰레드에서 리턴받을값이 없거나 기다릴필요가없을때 쓰레드를 떼어놓기 위해 사용합니다..
detach해놓으면 해당 쓰레드가 종료되면 자동으로 자원을 반환하게 됩니다..
그리고 외부에서 쓰레드를 죽이는건 좋지않고 조건을 두어서 스스로 자결(?) 하도록 하는게 좋습니다..-_-;

xjiwoox의 이미지

스레드 스스로 일정 조건에 의해서 종료시킬 때 그냥 return NULL 하지 마시고 가급적 pthread_exit() 함수를 사용하시는게 좋습니다.

s(˘∼˘*)z,·´″"`°³о$ √(´∀`√)... (˘ヘ˘ㆀ)a

verena의 이미지

class Thread{

 bool isRunning;

...

public:

 void stop() { isRunning = false;}

 void start() { isRunning = true;//이 이후에 쓰레드생성... } //<- 물론 이미 생성되어 있는지 체크해야겠죠.

 static void* handleRunner(void* arg) { return run(); } //<- 이 부분은 너무 딴지 걸지 마세요. 그냥 편의상 이렇게 한것 뿐이에요^^; run()앞엔 arg로 넘겨 받은 Thread포인터 변수가 당연히 있어야 하구요 ^^;

 void* run();

};

void* Thread::run()
{

 while(isRunning){

 ..

 
 }

 ...

 return 0; // 그외 필요한 일들...

}

하는 엉뚱한? 방법도 있답니다. ^^;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.