multi thread 관련 질문입니다

idrukawa의 이미지

여러개의 thread 를 종료하는데

각 thread 마다 종료할 때 자원해제 작업으로 인해 시간이 조금 필요합니다. 약 0.3초
또한 각 thread들은 mutex로 동기화되어 순서대로 종료되어야 합니다.

여러개의 thread를 연속으로 종료할 때
pthread_cancel(thr1);
pthread_cancel(thr2);
pthread_cancel(thr3);

이렇게 해주면 thr1이 pthread_cancel을 맞고 종료작업(자원해제)을 하고 있는 도중에
thr2가 pthread_cancel을 맞고 종료작업을 합니다. 이때 coredump가 발생하구요..

일단 꼼수로 thread종료 간 sleep을 주어 해결은 봤는데요.

정석적으로 pthread_cancel(thr1)이 종료되면 어떤 신호를 받고
pthread_cancel(thr2)을 수행하고... 하는 방식을 적용했으면 합니다만

기술적으로 어떻게 구현해야 할까요?

haze11의 이미지

pthread_cancel 보다는 상태값을 이용해서 스레드 종료 후 pthread_join 하는게 좋지 않나요?

cinsk의 이미지

pthread_join()이 pthread_cancel()보다 훨씬 낫긴 하지만, 그와 별개로, pthread_cancel() 때문에 segmentation fault가 나는 건 아니거 같군요.

pthread_cleanup_push/pthread_cleanup_pop() 등을 잘 못 썼거나, 해제하는 코드가 문제가 있는 것 같은데, 코드를 볼 수 없기 때문에. ;)

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

김성진의 이미지

어떤 환경인지는 알 수 없지만, thread cancel은 저도 대학원때 공부할 때 잠깐 써 보고,

이후에는 사용하고 있지 않습니다. 왜냐하면 일단 플랫폼 마다 cancellation point라고 불리는

기 정의된 함수에서 종료할 수 있는데, 이 함수의 종류가 각각 다르고,

더 큰 문제는 어느 시점에 쓰레드가 종료할 수 있을 것인지를 결정하기가 불가능하다는 것입니다.

보편적으로 이런 경우 해당 쓰레드 루프에서 플래그를 체크해서 능동적으로 종료하는 것이

디버깅도 쉽고 이식성도 고려한 안전한 방법이라고 생각됩니다.

돌고 있는 쓰레드를 어떻게 control한다는 아이디어는 자바에서도 초창기에

suspend & resume 개념으로 도입을 했다가 결국 deprecate된 사례를 보더라도

그리 만만한 주제가 아님을 알 수 있습니다.

pthread_join() 도 함수의 특성상 임의의 그룹에 대해서 종료하도록 하는 것이

불가능하기 때문에 지금은 고인이 되신 스티븐께서 많은 불평을 했던 것이기도 합니다.

segmentation fault는 이것과 무관한 다른 이슈라고 보입니다.

김성진

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

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

idrukawa의 이미지

thread는 자살하도록 하는것이 가장 좋다고 하죠 ㅎ

pthread_cancel()을 얻어맞은 thread는 스스로 pthread_exit()을 호출해서 자살한다고 알고있습니다..

또한 각 thread가 중요한 동작을 하는도중에 자살하라는 요구를 받고(pthread_cancel) 자살해버리는 일이 없도록 각 thread의 roop 처음 부분에 pthread_testcancel로 종료지점을 지정해주었고요...

또... cinsk님 말대로 cleanup_handler를 살펴보고 문제점을 발견해 수정해놓은 상태입니다 ㅎ

이런 상태에서 2초주기로 thread종료 & 생성을 반복하도록 메시지를 보내면
이 메시지를 받은 main_thread는 다른 thread 들을 생성/cancel합니다.
정상적으루요.

하지만 sleep 없이 무쟈게 빠르게 메시지를 보내면 coredump 발생이염...ㅎ

main_thread에 mutex_lock을 걸어서 cond_sig_wait을 주고,
pthread_cancel을 맞는 thread의 cleanup_handler에서 condition_signal을 보내는 방법은
어떨까요?

//==============================
// 시간은 멈춤이 없다 - QtheKan
//==============================

댓글 달기

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