스레드를 쉬게 하다가 깨워야 합니다

익명 사용자의 이미지

멀티스레드 시뮬레이터를 짜야합니다. 스레드간의 데이터 의존성은 없지만 작업이 모두 끝났으면 메인 스레드가 지시하기 전까지 기다려야 합니다. 조건 변수를 이용할려고 해봤지만 반드시 뮤텍스가 걸려있어야 해서 불가능합니다. 스레드를 매번 생성하는 방법도 있지만 오버헤드가 너무 큰 작업입니다. 재귀적인 생성도 답은 아닌 것 같고 모든 스레드를 무한한 시간동안 대기시키기만 하면 됩니다. 방법이 없을까요?

ktd2004의 이미지

dummy 뮤텍스와 함께 조건 변수를 사용하시는 것이 원하시는 답일 수 있습니다.

라스코니의 이미지

필요한 조건이 어떤 건지 잘 모르겠네요.
기본적으로 쓰레드가 무한 루프가 있는 형태인지 그냥 끝나는 형태인지 확인이 필요합니다.

아마 semaphore broadcast 같은 구조가 필요할 것 같네요.

익명 사용자의 이미지

스레드는 끝나는 형태는 아니고 무한 루프의 형태입니다. 따로 알아서 종료하지는 않고 메인 스레드가 다 관리합니다.

라스코니의 이미지

라운드 로빈 방식인지, 우선 순위 방식인지 모르겠지만

task() {
   while(1) {
      wait_semaphore();
      // do something
   }
}
 
main_thread()
{
   while(1) {
      // do something
      semaphore_broadcast();
   }
}

식의 구성을 생각해 볼 수 있겠습니다.
jick의 이미지

> 조건 변수를 이용할려고 해봤지만 반드시 뮤텍스가 걸려있어야 해서 불가능합니다.

Condition variable은 wait 상태에 들어가면 뮤텍스가 풀립니다. 여기에다 notify_all을 쓰면 원하는 상황에 딱 맞을 것 같은데요, 안되는 이유라도..?

익명_사용자의 이미지

pipe, socket, message queue또는 pthread_kill()/pthread_sigmask()를 이용하여 thread간 동기화를 할 수 있습니다. 근데, 저도 왜 mutex를 못쓰시는지 궁금하네요. conditional_variable이 가장 편할텐데요.

man 7 mq_overview
man 7 pthread
man 7 pipe
man 7 socket

작성자의 이미지

man에서는 정의되지 않은 동작이 발생한다고 하는데 정말로 정의되지 않은 동작이 지금 발생하고 있어서요...

jick의 이미지

정확히 안되는 부분이 뭔지 잘 모르겠는데, condition variable은

* 일단 뮤텍스를 걸고
* cv.wait()를 실행하면
* 내부에서 atomic하게 뮤텍스를 풀고 기다리다가, cv에 신호가 오면 다시 뮤텍스를 건 다음 걸린 상태로 리턴합니다.
* 리턴을 받은 쪽에서는 뮤텍스가 걸려 있으니까 안심하고 자기가 기다리던 조건이 만족하는지 재확인한 다음, 상황에 맞게 다시 cv.wait()를 부르거나 뮤텍스를 풀고 하고 싶은 걸 하면 됩니다.

그러니까, cv.wait()를 부를 때 뮤텍스를 안 걸고 부르면 당연히 안됩니다.

작성자의 이미지

뮤텍스가 필요하지 않아서 답변대로 더미 뮤텍스를 사용하고 조건변수를 기다리는 식으로 땜빵했었는데 나중에 뮤텍스를 사용해야 되는 순간이 오니까 데드락이 걸리더군요. 이 부분은 다른 뮤텍스를 만들면 해결될까요?

bushi의 이미지

mutex 한 개로 데드락을 유발할 수 있는 방법은 한 개 뿐입니다.
mutex 가 non-recursive 로 설정된 상태에서, 같은 쓰레드에서 lock 만 중복해서 시도하는 경우.

https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032r/index.html#sync-ex-23 에 condvar 를 사용할 때 mutex 를 어떻게 해줘야 하는지 예제가 있습니다.

댓글 달기

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