mutex 관련 질문

woosokie의 이미지

A,B라는 2개의 스레드가 있고
A 스레드에서 pthread_mutex_lock(), pthread_mutex_unlock()을 호출하며
루프를 돌고 있습니다. 루프는 unlock호출 후 바로 lock을 호출합니다.

문제는 다음과 같습니다.
A 스레드에서 lock이 호출 되어 작업이 이루지는데
B 스레드에서도 lock을 시도하여 B 스레드는 멈추어 있는 상황입니다.
A 스레드가 unlock을 호출하면 바로 B 스레드가 작업을 시작할 줄 알았는데
계속 A 스레드에서만 작업이 이루어지네요.

그래서 미봉책으로 A 스레드의 unlock 이후 sleep(0)으로 해결했는데....

왜 B 스레드에서 lock이 걸려 있는데 A 스레드에서만 작업이 이루어질까요?
또 sleep()말고 좋은 해결책은 없을까요?

jick의 이미지

대부분의 경우 (load가 아주 높지 않으면) 그냥 맘편히 기다리시면 언젠가 B 스레드가 작업을 시작할 것 같다는... 느낌이.. 듭니다. (장담은 못하겠군요.)

Mutex는 공평함을 보장하지 않습니다. 만약 로직이 "A가 작업을 끝냈을 때 B가 기다리고 있으면 반드시 B가 작업을 시작해야 한다"라면 다른 방법을 사용해야 합니다.

baboda4u의 이미지

우선순위 문제가 아닐까 싶내요 ^^

============================
Stay Hungry, Stay Foolish

============================
Stay Hungry, Stay Foolish

poongdi의 이미지

mutex가 공평함을 보장하지 않는것은 맞습니다.
A만 계속 실행될 수도 있는것이죠.
A와 B가 공평하게 실행되길 원하신다면 A가 끝나는것을 B에 알려주는 방법을 사용하시는게 어떨까요.
http://tong.nate.com/heheya/32698392
==

MP

MP

woosokie의 이미지

네. 답글 감사합니다.
mutex에 대해 공평함(?)을 보장하는줄 알았습니다.
A가 끝나는걸 B에 알려주는 방법으로 Semaphore를 통해
해결 했습니다.

powersys의 이미지

구현 방법에 따라 다르겠지만..Semaphore 자체가 답이되진 못합니다.
여전히 동일한 문제가 발생할 수 있으며. Semaphore든..
전역변수든 자신이 수행후 다른쓰레드의 작업이 없이는 재lock을 할 수 없는 구조로했다면
문제는 해결가능합니다만 그건 궂이 Semaphore가 문제 해결책 이라기보다 조건재진입으로 구현한것으로 볼 수 있겠네요..

cinsk의 이미지

conditional variable을 써서 thread A가 thread B를 깨우는 형태로 바꿔보기 바랍니다.

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

powersys의 이미지

unlock 후 바로 lock을 걸경우.. 한 쓰레드가 수행되다가 다른 쓰레드에게 자원이 넘어갈 틈이 없기때문에 대부분비슷한 현상을 보일겁니다.

정확한 수행의 순서가 필요한것이 아니라면.. sleep을 사용하시면 될듯합니다.

Iinux의 이미지

제 생각에 조건변수를 써도 마찬가지일듯하네요

pthread_yield() 함수를 쓰면 다른 스레드가 실행하지 않을까요?

(저는 사용을 안해봤습니다만.. )

=====================

=====================

dorado2의 이미지


조건 변수를 써서 wait, signal을 사용하면 명시적으로 B thread를 실행할 수 있습니다.

대신 조건 변수를 사용할 때는 A, B thread의 동작 절차 및 순서를 확실히
설계한 후에 사용하여야 오류로 고생하는 일이 없을 것 같네요.

댓글 달기

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