Mutex - Condition 이해가 안되요 ㅠㅠ

bluedisk의 이미지

흠...당췌 기초가 부실하다보니 컨디션이란 놈의 의미는 알겠는데 동작이 영 갑갑합니다.
쓰라는데로 쓰면 어떻게 작동한다는건지는 알겠는데 말이죠..

생산자/소비자 모델을 예를 들자면(큐를 쓴다고 가정하고 편의상 push/pop으로 표기했습니다)

생산자는 생산->lock->push->signal->unlock->loop... 라고 했을때
소비자는 lock->wait->pop->unlock->소비->loop... 이런 식이 될텐데요.

문제는 소비자가 wait->pop->unlock 하는동안 생산자가 signal에서 대기해야 된다는게 불합리해 보입니다.
생산은 공유 자원인 큐가 아니라 별도에 버퍼에 한다고 한다면 pop하는동안 기다려야 될필요성이 없으니까요.

또 어떤 셈플코드를 보니 signal할때 lock/unlock를 안하고 wait전에도 lock없이 wait후에만 unlock해주는 경우도 있던데요.
어느 사이트에 보면 signal할때와 wait할때는 lock상태여야 한다고 하니 그것도 햇갈려서 갑갑하네요.

그럼 고수님들의 시원한 답변 부탁드리겠습니다...꾸벅...

PS: KLDP에 가입 1년 반만에 처음 올리는 글입니다. 아무도 답변 안해주시면 충격으로 은둔형폐인이 될 가능성이 있으니 한생명 도와주십..쿨럭

SoulreaveR의 이미지

저렇게 코드를 작성한 것은 소비자의 입장에서 '최소한 하나 이상의 생산된 물건이 있을 때' 소비하겠다는 의지로 보이는데요. 생산자가 단시 signal만 보내고 계속 생산을 한다면 그렇게 불합리하다는 생각은 들지 않습니다. 즉 소비자는 queue가 비어있으면 그냥 wait하다가, 생산자가 하나 이상이라도 밀어넣으면 그때부터 깨어나서 소비하기 시작하고 생산자는 소비자의 상태와는 상관없이(물론 queue가 가득 찼을 경우는 고려해야 겠지만) push하고 그냥 무작위로 signal을 보낸다고 생각하는 것이 맞다고 봅니다.

그리고 두번째 - wait할 때나 생산할 때 unlock / lock을 안하는 것도 queue상태를 보고 판단한다고 생각되는데요. 역시 생산자는 소비자의 상태와 관계없이 queue에 push하고 무조건 signal을 보내며, 소비자는 queue가 비면 알아서 wait로 들어간다... 이렇게 생각되는데, 문제는 queue의 head / tail(맞나요?)를 어떻게 동기화 하느냐가 문제이며 두번째에서는 그 문제가 상관이 없거나 다른 방법으로 해결하였기 때문에 굳이 lock / unlock을 안하지 않나 라고 추측합니다.

SoulreaveR의 이미지

head / tail 동기화 할 필요가 -_-; update하는 주체가 다르니 -_-;

IsExist의 이미지

소비 스레드가 wait을 호출하면서 wait 함수 내부에서 unlock 이 호출됩니다.
그러니 wait에 진입한 후에는 mutex에 대한 점유을 가지고 있지 않으니 걱정
안하셔도 됩니다. wait에서 빠져나오면서 lock을 걸고 나오기 때문에 pop한 다음
unlock을 호출 하는 겁니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

댓글 달기

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