매뉴얼 페이지를 인용하려면 :
조건 변수를 사용할 때 스레드가 계속 진행되어야하는 각 조건 대기와 연관된 공유 변수와 관련된 부울 술어가 항상 있습니다. pthread_cond_timedwait () 또는 pthread_cond_wait () 함수에서 가짜 웨이크 업이 발생할 수 있습니다. pthread_cond_timedwait () 또는 pthread_cond_wait ()의 리턴은이 술어 값에 대해 아무 것도 암시하지 않으므로 해당 리턴시 술어를 다시 평가해야합니다.
그래서, pthread_cond_wait
당신이 그것을 신호하지 않은 경우에도 반환 할 수 있습니다. 언뜻보기에는 꽤 끔찍한 것 같습니다. 그것은 잘못된 값을 무작위로 반환하거나 실제로 올바른 반환 문에 도달하기 전에 무작위로 반환되는 함수와 같습니다. 큰 버그 인 것 같습니다. 그러나 그들이 수정하기보다는 매뉴얼 페이지에서 이것을 문서화하기로 선택했다는 사실은 pthread_cond_wait
가짜로 깨어나는 이유가 합법적 인 이유가 있음을 나타냅니다 . 아마도 도움이 될 수 없도록 작동하는 방식에 본질적인 것이 있습니다. 문제는 무엇입니까.
왜 않는 pthread_cond_wait
가짜로 복귀? 신호가 올 바르면 깨어날 것이라고 보장 할 수없는 이유는 무엇입니까? 누구나 가짜 행동의 이유를 설명 할 수 있습니까?
pthread_cond_(timed)wait
. "신호가 전달되면 ... 중단되지 않거나 스퓨리어스 웨이크로 인해 0을 반환합니다. " 다른 차단 기능은 EINTR
신호에 의해 중단 read
되거나 (예 :) 재개해야하는 경우 (예 :)를 나타냅니다 pthread_mutex_lock
. 따라서 가짜 웨이크 업에 대한 다른 이유가 없다면 두 가지 pthread_cond_wait
중 하나로 정의 될 수 있습니다.