세마포어를 이용하여 제한된 스레드만 진입 가능하도록 설정해보자.
1. Semaphore
세마포어는 각 acquire() 호출로 감소하고, 각 release() 호출로 증가하는 내부 카운터를 관리합니다. 카운터는 절대로 0 밑으로 내려갈 수 없습니다; acquire()가 0을 만나면, release()를 호출할 때까지 기다리면서 블록합니다.
- acquire(): 세마포어를 얻는 것. 내부 카운터가 0보다 크면, 1 감소시키고 True를 즉시 반환합니다. 0이면, release()가 호출될 때까지 기다린 다음 True를 반환합니다.
- release(): 세마포어를 반답하고 내부 카운터를 1 증가하여 세마포어를 얻기 위해 대기하는 테스크에게 작업을 하게 할 수 있습니다.