쓰레드 종료시 문제 발생

성석진의 이미지

멀티쓰레드 환경을 pthread_create() 함수를 사용하여 여러개 만들어 잘 사용하다가 "kill -9 pid"하여 임의의 쓰레드를 종료시키면 해당 pid의 쓰레드만 종료되는 것이 아니라 모든 쓰레드가 다 종료됩니다.
RTOS 환경에서는 multi thread를 구현하고 debug 기능으로서 하나의 쓰레드를 종료시키고 다시 생성시키는 일이 다반사인데 이를 어쩌면 좋지요?
Linux를 사용한지 얼마안되 잘 모르니 고수님들의 현상에 대한 설명과 예제가 있으면 보여주시기 바랍니다.
Linux는 RedHat 8.0을 사용했고 커널은 2.4.18-14 버젼입니다.
그럼, 답변 부탁 드립니다.

stoneshim의 이미지

signal은 process에 전달되는 것이기 때문에 SIGKILL 이 동일 process에 속하는 어떠한 thread에 전달된다고 해도 process의 모든 thread가 종료합니다.

하나의 thread에서 exit 을 호출하는 경우에 해당 process의 모든 thread가 종료하는것과 마찬가지 입니다.

하나의 thread만 종료시키기 위해서는 pthread_cancel 을 사용하셔야 합니다.

LinuxThread에 대해서는 다음 문서를 읽어보시면 도움이 되시리라 생각됩니다.
http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html

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

june8th의 이미지

동일한 process id를 가지는 것이 상식(?)인데,
LinuxThread의 구현에 의해 각 thread가 다른 pid를 가지는 것으로 보입니다.
제 주위의 linux를 보니까. kernel 2.4.20 (한컴 3.x)을 사용하는 linux box에서는
pid가 하나로 보이더군요..

아뭏든, thread별로 pid가 보이는 프로그램에서는 각 thread별로
signal handler를 등록하면, 해당 thread에서 signal 처리가 됩니다.
그러므로, thread의 main loop에 signal이 도착했음을 알리는 flag를 두면
thread cancel을 하지 않고도 종료시킬수 있습니다.

경험에서 얻은 것이어서 정확한 이유라던지 그런거는 모르겠네요... :-)

아래처럼 하면 되지 않을까 싶긴한데요.
이것은 thread별로 모두 다른 pid를 가지는 경우에만 해당되는 겁니다.

signal_handler() 
{
    expired[getpid()] = true;
}

thread_main(...)
{
    signal handler 등록
    while( ! expired[getpid()] ) {

    }
}
성석진의 이미지

그런데 하나의 프로세스 안에서 생성된 다수의 쓰레드들이 같은 pid를 갖는것은 Solaris에서 그렇고 POSIX에서는 서로 다른 pid를 가지는 것이 맞는것 같읍니다. 처음의 제 생각은 하나의 쓰레드를 죽일때 모든 쓰레드들이 죽는 이유는 해당 쓰레드에서 signal이 발생하고 이것이 모 프로세스에 전달되고 다시 모든 쓰레드에 전달되기 때문이라고 생각하고 글을 올린것인데 곰곰히 생각해보니 문제가 발생한 쓰레드가 물론 signal을 발생시키지만 이 signal을 받은 모 프로세스가 종료되기 때문에 모든 쓰레드가 종료되는 것 같읍니다.
rmflrh 해결 방법이라고 생각한 것이 각 쓰레드를 만들때 pthread_create() 후에 signal()을 사용하여 특정 signal에 대해 mask시키는 것을 생각해 보았는데 만약 저의 생각이 맞는다면 이것은 소용없는 일이고 만약 아니더라도 프로그래머의 실수로 발생하는 하나의 쓰레드의 segmentation fault 등은 다른 쓰레드에 영향을 안 줄 수 있지만 "kill -9 pid"로 시험하는 경우에는 방법이 없다는 것입니다. 모든 쓰레드가 다 종료되겠지요.

아~. 정말 방법이 없는 것일까요?
일단은 방법이 없는 것으로 생각하고 있읍니다.
해결하신 분이 계시면 알려주시기 바랍니다.

Love means never having to say i'm sorry.

고도리의 이미지

UI를 thread를 하나 만들어서 명령어로 해당 thread만 cancel시키도록
함 작성해 보세요...

하나씩 죽이면서 증상을 보려면 제일 확실한 것 방법이 손으로 pthread_exit()(맞나 모르겠네요...오래되서리.)나 비스므꾸리한 녀석을 사용해서
죽이고
또 살리고 싶으면 명령어로 살리게 하면요...

옛날에 비슷한 방법으로 pthread_create()를 호출해서 살린적이
있는 것 같기도 한데...

큰 어려움은 없겠지만 thread를 죽이는 것은 아시겠지만 서로 lock같은
것을 물로 있을 경우라던가 공유데이터를 이용하는 다른 쓰레드와
연관이 있을 경우 죽인다는 자체가 그렇게 좋지만은
않ㅇ르 거라고 생각이 됩니다.

그럼...

서명.....음, 서명이라...

아싸!!! Three Go!

stoneshim의 이미지

Quote:
그런데 하나의 프로세스 안에서 생성된 다수의 쓰레드들이 같은 pid를 갖는것은 Solaris에서 그렇고 POSIX에서는 서로 다른 pid를 가지는 것이 맞는것 같읍니다.

POSIX에서 서로 다른 pid를 가지는것이 아니라 LinuxThread 에서만 그렇습니다. 그리고 june8th 님이 말씀하신 대로 최근의 Linux kernel에서는 동일한 pid를 가집니다.

Quote:
"kill -9 pid"로 시험하는 경우에는 방법이 없다는 것입니다.

네 방법이 없습니다. 그리고 모든 thread가 죽는것이 POSIX 표준입니다.

그런데 왜 "kill -9 pid" 로 하나의 thread만 종료시키고 싶어하시는지 궁금하네요. 이 방법은 불가능한 것이지만 궁극적으로 원하시는것을 말씀하신다면 도움이 될만한 팁들이 존재하지 않을까요?

LinuxThread와 signal의 관계에 대해서는 앞에서 말씀드린 FAQ를 읽어보시면 도움이 되실 겁니다. 특히 signal에 대한 부분은 다음과 같습니다.
http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html#J

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

댓글 달기

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