닫을 수 있는 Queue는 data·empty·closed를 함께 판정한다

empty만 기다리면 close 뒤 영원히 대기할 수 있어 종료 상태를 predicate에 포함합니다.

  1. 1

    lock

    상태 snapshot

  2. 2

    empty && !closed

    wait

  3. 3

    data 있음

    dequeue

  4. 4

    closed && empty

    END 반환

  5. 5

    signal

    put·close 뒤 알림

핵심: closed여도 남은 데이터가 있으면 drain한 뒤 종료할지 계약으로 정합니다.