thread의 종료를 알아낼 수 있는 방법이 없을까요?

syan의 이미지

pthread_exit()로 종료하는 thread를 감지해서 적절한 처리를 하려면 어떻게 해야할까요?

pthread_join()은 특정 thread의 종료를 기다리는 함수라서 적절하지 않을 것 같은데요.

예를 들어서 thread를 사용한 서버에서 어떤 thread가 죽었을 때 다시 그 같은 쓰레드 식별자(?)로 쓰레드를 재생성하려면 해당 쓰레드를 알아내야하는데, 어떤 방법이 있을까요?

onezero3의 이미지

Thread는 하나의 세그멘트 내에서 동작하므로, 하나의 쓰레드가 죽으면 프로세스 전체가 사망하게 됩니다.
따라서, 멀티 프로세스 프로그램에서 처럼 쓰레드 하나가 죽은 경우 다시 살려주는 것은 별다른 의미가 없는 것으로 보이며, 스스로 return 하는 경우에는 굳이 다른 Thread 에서 기다릴 필요 없이 return 하는 곳에서 종료처리를 해야 할 것으로 보입니다.

pynoos의 이미지

윈도우의 Thread 처럼 Thread handle이 selectable 하지 않지요.

pipe 같은 것을 두어 read는 부모 thread가 하고, 자식 thread에서는 write 하는 용도로 사용하여, Thread 종료 직전에 thread ID 같은 것을 write 하고, 부모는 pipe를 select 하는 것이 좋겠습니다.

아무래도, select 에 들어가도록 하는 것이 좋을테니 말이죠.

김성진의 이미지

비정상 상황이 아닌 이상 특정 쓰레드의 종료시 불려져야 할 핸들러를

정의하는 방법인 POSIX 표준에 있습니다.

바로 TSD(Thread Specific Data)를 이용하는 방법입니다.

TSD를 위한 key를 create할 때 exit 핸들러를 선택적으로

등록해 주도록 되어 있습니다. (NULL이면, 등록하지 않는 것입니다)

따라서, 어떤 쓰레드가 생성되었다면 위의 키에 대해서

set_specific을 한번 해 주시면, 그 쓰레드 종료될 때

해당 핸들러가 불리게 됩니다.

김성진 드림

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

stoneshim의 이미지

Quote:
비정상 상황이 아닌 이상 특정 쓰레드의 종료시 불려져야 할 핸들러를

정의하는 방법인 POSIX 표준에 있습니다.

바로 TSD(Thread Specific Data)를 이용하는 방법입니다.

이러한 방법으로는 pthread_cleanup_ 계열의 함수를 사용할 수도 있습니다.

그런데 논의되는 내용은 한 thread가 pthread_exit이나 pthread_cancel등의 이유로 terminate되는 경우에 이 thread를 create한 thread(편의상 main thread라고 부르겠습니다.)가 알아차릴 수 있는 방법이 무엇이냐 에 있는것 같습니다.

pthread_key_ 계열의 함수나, pthread_cleanup_ 계열의 함수를 사용한다면, 해당 thread가 terminate 되기 직전에 해당 thread의 실행 context에서 callback이 호출되므로, 결국 이 callback 함수에서 main thread에게 알려주는 행위를 해주어야 하지 않을까요?

결국, pynoos님께서 말씀해주신 pipe등을 이용하는 방법이나, 혹은 pthread_kill()로 main thread에게 signal을 날리는 방법을 사용해야 할 듯 합니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

댓글 달기

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