세마포어는 사용 가능한 허가증 수를 관리합니다. 작업이 허가증 하나를 얻어 들어가고, 완료 시 반환하면 대기 중인 작업이 이어받습니다.
뮤텍스와 달리 허가 수를 2 이상으로 둘 수 있어 동시 접근 수를 제한하기 좋습니다. 허가를 반환하지 않으면 처리량이 줄거나 전체가 멈추므로 종료 경로를 챙겨야 합니다.
언제 쓰나
동시 API 요청이나 연결 수처럼 한 번에 실행할 작업 수를 제한할 때 씁니다.
허용된 수만큼 작업을 통과시키고 초과 작업을 기다리게 합니다.
<div class="v"><header><b>SEMAPHORE · 2 PERMITS</b><span id="state"></span></header><main><div class="jobs" id="jobs"></div><div class="permits" id="permits"></div></main><footer>release wakes next waiter</footer></div>.v{width:min(92vw,660px);height:min(86vh,310px);box-sizing:border-box;padding:clamp(9px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:7px;color:var(--fg);font:500 clamp(15px,3.2vmin,17px)/1.25 var(--font-sans, sans-serif)}.v header,.v footer{display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap}.v header b{color:var(--accent);font-size:.9em}.v header span,.v footer{color:var(--muted);font-size:.82em}.v main{flex:1;min-height:0;position:relative;overflow:hidden}.v .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.v .active{background:var(--accent)!important;color:var(--bg)!important;border-color:var(--accent)!important}.v .muted{opacity:.28} .jobs{height:59%;display:flex;justify-content:center;align-items:center;gap:5px}.job{width:22%;padding:11px 2px;border:1px solid var(--line);border-radius:6px;text-align:center;font:600 .85em ui-monospace,monospace}.permits{text-align:center;color:var(--accent);font:600 .85em ui-monospace,monospace}let n=0;function draw(){document.getElementById("jobs").innerHTML=["A","B","C","D"].map((x,i)=>"<div class=\"job "+(i>=n&&i<n+2?"active":i<n?"muted":"")+"\">"+x+"</div>").join("");document.getElementById("permits").textContent="running: "+["A + B","B + C","C + D","D + A"][n];document.getElementById("state").textContent="2 of 2 held";n=(n+1)%4}draw();setInterval(draw,1000)세마포어는 사용 가능한 허가증 수를 관리합니다. 작업이 허가증 하나를 얻어 들어가고, 완료 시 반환하면 대기 중인 작업이 이어받습니다.
뮤텍스와 달리 허가 수를 2 이상으로 둘 수 있어 동시 접근 수를 제한하기 좋습니다. 허가를 반환하지 않으면 처리량이 줄거나 전체가 멈추므로 종료 경로를 챙겨야 합니다.
동시 API 요청이나 연결 수처럼 한 번에 실행할 작업 수를 제한할 때 씁니다.