[완료]thread 랑 signal 관련 질문입니다.

cococo의 이미지

안녕하십니까, 추석 잘 쇠고 계신지 모르겠네요.

thread 에 signal 을 전달하려고 하는데요, 생각했던 것과 다르게 움직여서 이상하다....해서 올려봅니다.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread/Beginning/PthreadApiReference#AEN226

여기를 보면... parent process에 시그널을 보내면 모든 child thread에 시그널이 전달된다... 라고 써 있는데요.

이거 혹시 [1. 모든 child thread에 시그널이 전달되어 모든 child thread가 시그널을 반드시 수신한다] 라는 의미가 아니라
[2. 모든 child thread에 시그널이 전달된다, 고로, 어떤 child thread가 시그널 수신할 지는 알 수 없다.] 라는 의미인가요?
프로그램 짜다 생각대로 안돌아가서 디버그 로그를 보니까, [1.] 이 아니고 [2.]처럼 움직이는 거 같아서요.

맨첨에 만들려 하던 건요.

thread_signalhandle( int signo ) {
...
printf( " tid:%d signo:%d ", pthread_self(), signo )
}
thread_foo() {
...
sigact.sa_handler = thread_signalhandle;
...
}

int main()
{
pthread_t t[ .. ];

...
pthread_create( t[..], NULL, thread_foo, args );
pthread_create( t[..], NULL, thread_foo, args );
...

while( 1 )
{
...
sleep( ... );
raise( SIGSUSR1 );
...
}

pthread_join( t[..], rv );
...
}

대충 이런 식이구요.
기대했던 건... 생성시킨 모든 스레드가 1개의 SIGUSR1에 대해 tid:XX signo:X 를 뿌려주는( 쓰레드 4개라면 printf도 4번) 걸 기대했는데요.
실제로는 1개의 SIGUSR에 대해 1개의 print밖에 안나오더라구요. 그래서
[2. 모든 child thread에 시그널이 전달된다, 고로, 어떤 child thread가 시그널 수신할 지는 알 수 없다.]
로 추측했습니다만...

답 아시는 분...답변 부탁드립니다. -_-;;

oomymy의 이미지

제가 알기로는 시그널이라는 것은 프로세스에게 전달 되는 것입니다.
그리고 전달된 시그널을 프로세스내에 어떤 쓰레드가 처리할 지는 아무도 모르죠.
심지어 system call을 하려고 블럭되어 있는 쓰레드가 그 시그널을 받아 처리하기도 하죠.
(자원 활용 측면에서 좋은 방법이긴 합니다만, 코딩할 때 참 고려해줄게 많아지죠.)

제가 보기에 쓰레드간의 통신을 하려고 하시는 것 같은데, 시그널말고 다른 방법을 생각해보심이...

cococo의 이미지

일반적으로 시그널은 잘 안 쓰나요?
쓰레드가 잠들었다가 필요할때만 깨어나야 할 때는 주로 쓸 거 같은데.... 아닌가보죠?
쨌던 답변 감사합니다. 좋은 하루 되세요.

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

molla의 이미지

thread 종류에 따라 조금 다르게 동작하는 경우도 있긴 했던 것 같습니다만, 일반적으로는 2번이 맞습니다. 해당 process 내의 어떤 thread가 해당 signal을 받을지 모릅니다.

이를 피하고자 보통 multi thread 환경에서 signal을 사용할 때엔 signal 을 처리하는 thread를 제외하고 나머지는 모두 masking을 해 둡니다.

따라서 MT 환경에서는 signal을 이용하여 재우거나 깨우는 일을 잘 안 합니다.
(일반적으로 multi process 환경에서도 signal은 잘 안 쓰지 않나요?)

대신에 semaphore나 pthread_mutex 같은 것을 이용합니다.

cococo의 이미지

답변 감사합니다. 조금 더 생각해 봐야 겠네요.

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

댓글 달기

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