허용 수를 관리하기
사용 가능한 동일 자원이 세 개라면 초기 허용 수를 세 개로 두고 자원을 얻을 때 획득, 사용이 끝나면 반환하는 방식으로 접근 수를 제한할 수 있다.
단순히 일반 정수 변수를 확인한 뒤 하나 줄이는 두 단계를 작성한 것만으로는 충분하지 않다. 여러 실행 흐름이 같은 값을 동시에 읽는 경우를 막는 원자적인 동작이 필요하다.
기다림을 처리하는 방법
허용 수가 없을 때 획득하려는 작업은 기다리거나 실패 결과를 받을 수 있다. 실제 인터페이스에 따라 즉시 시도와 시간 제한 등 제공하는 방식은 다르다.
구현은 기다리는 작업을 잠들게 하거나 특정 조건에서 짧게 반복 검사하는 등 다른 전략을 사용할 수 있다. 기다림 자체가 언제나 CPU를 계속 소모하는 반복문인 것은 아니다.
잠금과 신호
이진 세마포어는 제한된 허용 상태를 이용하는 형태다. 자원 하나에 대한 접근 제한과 실행 단계 사이의 알림에 사용할 수 있지만, 소유권을 다루는 잠금과 모든 의미가 같지는 않다.
어떤 문제에 사용할지는 필요한 순서와 자원 수에 따라 결정한다. 실행 흐름이 언제 획득하고 어느 경로에서 반환하는지를 함께 명확히 해야 한다.
사용이 잘못되면
획득한 허용 수를 반환하지 않으면 뒤의 작업이 계속 기다릴 수 있다. 반대로 잘못된 추가 반환은 의도보다 많은 접근을 허용할 수 있다.
세마포어를 사용한다는 사실만으로 경쟁이나 교착이 모두 제거되지는 않는다. 오류 처리와 작업 취소, 여러 자원의 획득 순서까지 포함해 전체 동기화 규칙을 검토해야 한다.