조건변수와 뮤텍스에 대한 질문...

inviolable의 이미지

(류광 번역 고급 리눅스 프로그래밍 제 2판)

pthread_cond_wait함수가 조건 변수가 참이 될 때까지 기다리는 함수인데, 인수는 2개를 받습니다. 1번째는 조건변수, 2번째는 조건 변수를 보호할 뮤텍스입니다.

이해안되는 내용은 책 453p~에 있는...

pthread_cond_wait의 둘째 인수는 조건 변수를 보호할 뮤텍스이다. 이 인수에는 호출자가 잠근 뮤텍스를 지정해야 한다. 그러면 호출한 스레드가 해당 조건을 기다리는 스레드들의 목록에 등록되며, 스레드의 잠금이 풀린다. 이 두 연산은 원자적으로 일어나므로, 조건을 점검하는 시점과 스레드가 조건 변화를 기다리며 수면에 들어가는 시점 사이에 빈틈이 생기지 않는다. 주어진 뮤텍스는 pthread_cond_wait 반환 시점에서 다시 잠긴다.

이부분이 잘 이해가 안갑니다... 쉽게 설명 부탁드립니다...

shint의 이미지

inviolable의 이미지

글 쓸 때 시간이 없어서 너무 글을 간단히 적은 것 같은데요... pthread_cond_wait함수(이하 wait함수)를 호출할 때 호출한 스레드가 해당 조건을 기다리는 스레드들의 목록에 등록되며, 뮤텍스의 잠금이 풀린다. 이 두 연산은 원자적으로 일어나므로, 조건을 점검하는 시점과 스레드가 조건 변화를 기다리며 수면에 들어가는 시점 사이에 빈틈이 생기지 않는다. 따라서 스레드가 조건의 변화를 놓칠 여지가 없다.

여기서 제가 궁금한 점은, 호출한 스레드가 해당 조건을 기다리는 스레드들의 목록에 등록되며, 뮤텍스의 잠금이 풀리는 두 연산이 원자적으로 일어나는 것하고, 조건을 점검하는 시점과 스레드가 조건 변화를 기다리며 수면에 들어가는 시점 사이에 빈틈이 생기지 않는 것하고 관련이 있나요??? 하는 것과...

wait함수 자체가 조건을 기다리는 건데, wait함수가 조건을 점검한다는 식으로 씌여있는데 맞는 말인가요??? wait함수를 호출하면 그 함수 내부에서 조건 점검하는 코드가 있고, 그 이후 스레드가 수면에 들어가게 되는 건가요??? '조건을 점검하는 시점과 스레드가 조건 변화를 기다리며 수면에 들어가는 시점 사이에 빈틈이 생기지 않는다. 따라서 스레드가 조건의 변화를 놓칠 여지가 없다.' 이 문장이 정말 이해가 안되네요...

스레드가 조건 변화를 기다리며 수면에 들어가는 건 이해가 가는데... wait함수에서 조건을 점검한다는건 또 무슨 말이며(조건이 변화되면 signal함수(물론 pthread어쩌고 접두어가 붙습니다.)로 신호줘야 스레드가 조건 변화를 알게 된다고 책에 나와있는데요...) 이 부분이 이해가 안가니 뒤에 "따라서 스레드가 조건의 변화를 놓칠 여지가 없다." 이 말 또한 이해가 안되네요...

설명 좀 부탁드립니다...

shint의 이미지

너무 난해한 문장이니까요.

그거 대신. 이걸 다시 보세요.
http://blog.naver.com/lhkiloveyou?Redirect=Log&logNo=90147697256
http://blog.naver.com/undersky03?Redirect=Log&logNo=122337794
http://kldp.org/node/111584

쉽게 설명하면.
thread()
{
lock()
wait()
unlock()
}

- signal() 호출하면 멈춰있던 wait() 다음이 실행 된다.
- lock() unlock() 꼭 해줘라. 입니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

inviolable의 이미지

wait함수와 signal함수에 대해서 어떻게 사용해야 되는지는 알겠습니다. 이정도로 넘어가는게 좋겠군요...

익명 사용자의 이미지

pthread_cond_wait 메서드가 호출되면 뮤텍스가 언락(unlock)되면서 대기 상태로 들어가고, pthread_cond_signal 메서드가 호출되면 뮤텍스가 락(lock)된 상태로 전달되어 pthread_cond_wait 메서드를 호출한 스레드가 깨어나게 됩니다.

조건을 점검한다는 말은 뮤텍스가 언락이냐 락이냐 정도를 살펴보는 정도로 이해하셔도 될 거 같습니다.
pthread_cond_wait 를 호출한 스레드가 대기 상태로 들어가게 되면 뮤텍스가 언락된 상태가 되며, 스레드가 깨어나는 시점에는 뮤텍스가 락된 상태가 되므로...

목록에 등록되는 과정과 뮤텍스가 언락되는 과정이 원자적으로(atomic하다는 것은 해당 과정이 분해될 수 없음을 의미합니다) 일어나지 않으면,
목록에는 등록된 상태에서 pthread_cond_signal 메서드를 호출해 버리면 뮤텍스가 언락되지 않았으므로 pthread_cond_signal이 호출되었음에도 깨어나지 못하는 경우가 생기게 됩니다.

즉, [1. 리스트 등록, 2. 뮤텍스 언락, 3. pthread_cond_signal 호출] 이런식으로 동작되어야 되는 것이
원자적이지 않으면 [1. 리스트 등록, 2. pthread_cond_signal, 3. 뮤텍스 언락] 과 같은 형태로 동작될 수 있게 되므로 빈틈이 생기게 됩니다.
빈틈이 생김으로써, pthread_cond_wait를 호출한 뒤에 다른 곳에서 pthread_cond_signal이 호출되었음에도 조건 변화를 놓쳐 깨어나지 못하게 되구요.

퇴근해야 되서 ㅌㅌㅌ;

inviolable의 이미지

조건을 점검한다는게 뮤텍스를 락하고 언락하는 것이군요... 답변 감사드립니다...^^

댓글 달기

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