뮤텍스 잠금

Mutex lock

임계 구역에 한 작업만 들어가도록 잠금을 주고받습니다.

···
html
<div class="v"><header><b>MUTEX</b><span id="state"></span></header><main><div class="gate"><div id="a"></div><div class="lock" id="lock"></div><div id="b"></div></div><div class="counter" id="counter"></div></main><footer>one owner at a time</footer></div>
css
.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} .gate{height:68%;display:flex;align-items:center;justify-content:space-around;gap:6px}.gate>div{padding:10px 8px;border:1px solid var(--line);border-radius:6px;text-align:center;font:600 .85em ui-monospace,monospace}.lock{border-color:var(--accent)!important}.counter{text-align:center;color:var(--accent);font:600 .9em ui-monospace,monospace}
js
let n=0;const owners=["A","A","B","B"];function draw(){document.getElementById("a").textContent=n<2?"A inside":"A done";document.getElementById("b").textContent=n<2?"B waits":"B inside";document.getElementById("lock").textContent="LOCK → "+owners[n];document.getElementById("counter").textContent="shared count: "+(n+1);document.getElementById("state").textContent="owner "+owners[n];n=(n+1)%4}draw();setInterval(draw,950)

뮤텍스는 공유 상태를 수정하는 코드 구간에 한 작업만 진입하도록 합니다. 먼저 잠금을 얻은 작업이 끝나면 풀고, 대기하던 다른 작업이 이어받습니다.

잠금 범위를 너무 넓히면 병렬성이 줄고, 해제를 누락하면 다른 작업이 계속 멈춥니다. 가능하면 짧은 임계 구역에 적용하고 오류 경로에서도 반드시 해제해야 합니다.

언제 쓰나

여러 스레드가 같은 가변 자료구조를 수정할 때 씁니다.

페이지로 열기 ↗