park 전후 unpark 순서가 모두 동작하는 경로

permit이 선행 signal을 기억하고 대기 중 signal은 thread를 깨운다.

unpark 먼저

permit을 1로 만든 뒤 park가 이를 소비하고 바로 반환한다

no lost wakeup

park 먼저

thread가 WAITING한 뒤 unpark가 runnable하게 만든다

wake waiter
공통 조건park 반환 후 업무 condition을 다시 검사한다

핵심: permit 자체는 queue가 비었는지 task가 준비됐는지 나타내지 않는다.