스퓨리어스 웨이크 업의 TL; DR 가정 ( "계약")은 스레드 쉴더의 현실적으로 강력한 구현을 가능하게하기위한 합리적인 아키텍처 결정입니다.
여기서 "성능 고려 사항"은 관련이 없으며, 이는 권위있는 참고 문헌에 언급되어 널리 퍼져있는 오해입니다. (권한있는 참조는 오류가있을 수 있습니다. ' 갈릴레오 갈릴레이 에게 물어보십시오. ) 위키 백과 문서는 완벽하게 게시 된 참조를 인용의 공식적인 가이드 라인을 일치하기 때문에 방금 인용 노트에 대한 참조를 유지합니다.
이 답변 에는 가짜 웨이크 업 개념을 도입하는 훨씬 더 설득력있는 이유 가 바로이 기사의 (이전 버전)에 제공된 추가 세부 정보를 기반으로합니다.
가짜 웨이크 업에 관한 Wikipedia 기사 에는 다음과 같은 내용이 있습니다.
pthread_cond_wait()
Linux 의 기능은 futex
시스템 호출을 사용하여 구현됩니다 . EINTR
프로세스가 신호를 수신하면 Linux의 각 차단 시스템 호출이 갑자기 리턴 됩니다. ... 시스템 호출 pthread_cond_wait()
이 아닌 시간에 실제 깨우기를 놓칠 수 있기 때문에 대기를 다시 시작할 수 없습니다 futex
...
스레드 스케줄러는 기본 하드웨어 / 소프트웨어에서 비정상적인 문제로 인해 일시적인 정전이 발생할 수 있습니다. 물론 이것은 가능한 한 드물게 발생하도록주의를 기울여야하지만 100 % 강력한 소프트웨어와 같은 것은 없기 때문에 스케줄러가이를 감지 할 경우 이러한 상황 이 발생할 수 있다고 가정 하고 적절한 복구를 수행 하는 것이 합리적입니다 (예 : 누락 된 하트 비트 를 관찰하여 ).
이제 스케줄러가 정전 중에 어떻게 대기 스레드에 알리기위한 일부 신호를 놓칠 수 있다는 점을 고려하여 스케줄러를 복구 할 수 있습니까? 스케줄러가 아무 것도하지 않으면 언급 된 "불운"스레드가 중단되어 영원히 대기합니다.이를 피하기 위해 스케줄러는 단순히 모든 대기 스레드에 신호를 보냅니다.
따라서 대기중인 스레드에 이유없이 통지 할 수있는 "계약"을 설정해야합니다. 정확히 말하면, 스케줄러 정전이 발생하는 이유가 있지만 스레드가 스케줄러 내부 구현 세부 사항에 대해 알 수 없도록 설계되었으므로이 이유는 "스퓨리어스"로 표시하는 것이 좋습니다.
실의 관점에서 이것은 다소 Postel의 법칙 (일명 견고성 원칙 ) 과 비슷합니다 .
당신이하는 일에 보수적이며, 다른 사람들로부터 받아들이는 것에 자유 롭다
가짜 웨이크 업을 가정하면 스레드가 수행하는 작업 에서 다른 스레드를 알릴 때 조건을 설정 하고 허용되는 자유를 강제 합니다 . 대기에서 돌아올 때의 상태를 확인하고 아직 없으면 대기를 반복합니다.