pthread_cond_signal에 의해 sleep하던 스레드가 pthread_cond_wait에서 리턴할경우 spurious wake up때문에 반드시 while ( 조건 ) pthread_cond_wait( ) 형태를 취한다고 하던데요. spurious wake up는 어떤경우인지요?
여러 쓰레드가 wait하고 있다가 브로드캐스트로 깨어나게 되면 각각의 쓰레드가 바로 작업을 하는게 아니라 다시한번 조건을 체크해서. 자신이 작업을 할수 있는지 체크를 해줘야 합니다.
예를들어서 쓰레드풀 작업 큐에 한번에 2개의 잡이 추가되어서 브로드캐스로 쓰레드들을 모두 깨웠는데 그중에 먼저 깨어난 2개만 작업을 잡고 나머진 다시 큐에 들어 올때까지 wait해야 하니까요..;;
또 다른 경우는 lost signal로 인해서 데드락의 경우때문이죠 그건 아래의 문서를 참조하세요.. 4쪽쯤에 나와있네요
http://www.intel.com/software/products/assure/assuret_tutorial.pdf
울랄라~ 호기심 천국~!!http://www.ezdoum.com
텍스트 포맷에 대한 자세한 정보
<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]
음... 쓰레드가 여러개 일 경우..
여러 쓰레드가 wait하고 있다가 브로드캐스트로 깨어나게 되면
각각의 쓰레드가 바로 작업을 하는게 아니라
다시한번 조건을 체크해서.
자신이 작업을 할수 있는지 체크를 해줘야 합니다.
예를들어서 쓰레드풀 작업 큐에 한번에 2개의 잡이 추가되어서
브로드캐스로 쓰레드들을 모두 깨웠는데 그중에 먼저
깨어난 2개만 작업을 잡고 나머진 다시 큐에 들어 올때까지
wait해야 하니까요..;;
또 다른 경우는 lost signal로 인해서 데드락의 경우때문이죠
그건 아래의 문서를 참조하세요.. 4쪽쯤에 나와있네요
http://www.intel.com/software/products/assure/assuret_tutorial.pdf
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
댓글 달기