특정 thread에만 alarm을 사용하고 싶습니다.
글쓴이: 김경태 / 작성시간: 화, 2006/09/26 - 4:14오후
환경은 1 process, multi-thread라 가정합니다.
그리고 각각의 sub-thread들은 recv 대기중에 있으며 저는 원하는 시간에 이들을 깨우기 위해 alarm()시스템 콜을 사용하려고 합니다.
(time out에서 일반적으로 쓰는 방법, 즉 select 대기나 SO_RCVTIMEO등은 사용할 수 없다고 가정합니다.)
그러나 문제는 alarm이라는 system call이 per-thread가 아닌 per-process라는데 문제가 있습니다.
가령, multi-thread환경에서
alarm(5);
recv(...);
alarm(0);
과 같은 코드를 작성하면 불행하게도 recv에서 대기하고 있던 여러개의 thread가 동시에 wake-up하기 때문에 원하는 바대로 동작할 수 없습니다.
alarm이 아닌 pthread_kill을 사용하는 경우에
pthread_kill(pthread_self(), SIGALRM);
recv(...);
와 같은 Code에서 보듯이 recv에서 대기하는 것이 불가능하게 됩니다.
그래서 결국은 alarm()을 이용하여 SIGALRM을 발생시키면서도 모든 thread가 아닌 특정 thread에서만 SIGALRM을 받을 수 있는 제 3의 방법이 있어야 합니다.
이런 경우를 직접 Coding해 보신 분이 계신지 궁금합니다.
고수의 친절한 가르침을 기대합니다.
Forums:
alarm thread 를
그냥..sleep이 어떨까요?
일단 multi-thread에서
일단 multi-thread에서 가장 다루기 힘든 부분 중 하나가 signal 처리입니다. 힘든 건 둘째치고, platform에 따라서 제대로 동작하지 않을 수도 있습니다. 따라서 가능하면 signal을 쓰지 않도록 노력해보기 바랍니다. 그래도 꼭 signal을 써야만 한다면...
pthread_sigmask()를 써서 thread당 독립적으로 동작하는 signal mask를 등록하면 됩니다. 즉 signal을 받고자 하는 thread를 제외한 나머지 thread들에서 해당 signal을 블럭시키면 됩니다. (race condition을 방지하기 위해) thread를 처음 만들 때 자식 thread는 부모 thread로부터 signal mask를 상속받기 때문에, 자식 thread를 여러개 만들기 전에 먼저 블럭시킨다음 thread들을 만들고 나서 원하는 thread에서 unblock시키는 방법을 쓰는 것이 좋습니다.
노파심에서 말하지만 single threaded program에서 같은 목적으로 쓰는 sigprocmask()는 multi threaded program에서 쓰면 안됩니다.
자세한 것은 Programming with POSIX Threads에 잘 나와 있으니 참고하기 바랍니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
답변 감사드립니다.
상세한 가르침 감사드립니다.
하지만 말씀하신 그 방법으로 할려면 자식 thread들이 각각 다른 코드를 가져야 합니다만, 이 경우에는 자식 thread가 모두 같은 code를 통해서 동작해야 하므로 님께서 추천하시는 방법을 적용하기는 힘들 것 같습니다.
좀 더 명확하게 하자면,
thread 1:
alarm(5);
recv()
alarm(0);
thread 2:
alarm(5);
recv()
alarm(0);
thread 3:
alarm(5);
recv()
alarm(0);
과 같습니다.
alarm()이라는 system call을 사용해서 recv 대기하는 여러개의 thread들이 각자 원하는 시간에 alarm()을 통해서 특정 시간이 지난 후 wake up할 수 있는 방법이 무엇인지 궁금합니다.
혹시 알고 계신 고수님들이 계시다면 답변 주시면 감사하겠습니다.
제가 얼핏 보기엔
제가 얼핏 보기엔 따로 timer 루틴을 만들어 쓰는게 좋을 것 같습니다. 그리고 한 thread가 여러 timer의 expiration을 관리하고, 요청한 thread에 알려 주는 방식을 쓰면 될 것 같군요. 이 때 다른 thread에 알려주는 방식은 pthread_cond_wait(), pthread_kill(), pthread_cancel() 등을 잘쓰면 될 것 같기도 합니다.
여러 timer를 동시에 등록하고 관리하는 기법은 libSDL 소스에서 src/timer/ 부분을 참고하시면 될 것 같습니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기