원자적 연산

Atomic operation

공유 값을 한 번의 분리 불가능한 연산으로 갱신합니다.

···
html
<div class="v"><header><b>ATOMIC ADD</b><span id="state"></span></header><main><div class="atomic"><div class="jobs"><span id="job1">T1 +1</span><span id="job2">T2 +1</span></div><div class="counter" id="counter">0</div></div><div class="atomicnote" id="atomicnote"></div></main><footer>each add takes effect once</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} .atomic{height:68%;display:flex;align-items:center;justify-content:space-around;gap:8px}.jobs{width:40%;display:flex;flex-direction:column;gap:5px}.jobs span,.counter{border:1px solid var(--line);border-radius:6px;padding:7px;text-align:center;font:700 clamp(12px,2.8vmin,17px) var(--font-sans, sans-serif)}.jobs span.on{background:var(--accent);color:var(--bg)}.counter{width:34%;border:2px solid var(--accent);font-size:clamp(18px,5vmin,28px);color:var(--accent)}.atomicnote{text-align:center;color:var(--accent);font:600 clamp(12px,2.7vmin,16px) var(--font-sans, sans-serif)}
js
let n=0;function draw(){document.getElementById("counter").textContent=n;document.getElementById("job1").classList.toggle("on",n===1);document.getElementById("job2").classList.toggle("on",n===2);document.getElementById("atomicnote").textContent=n===0?"ready: 0":n===1?"T1 add → 1":"T2 add → 2";document.getElementById("state").textContent="value "+n;n=(n+1)%3}draw();setInterval(draw,1050)

원자적 더하기는 여러 작업이 같은 값을 바꾸더라도 읽기와 쓰기를 하나의 연산으로 처리합니다. 중간 상태가 다른 작업에 끼어들지 않아 단순 카운터 증가의 누락을 막을 수 있습니다.

복잡한 여러 단계의 불변식까지 자동으로 보호하지는 않습니다. 비교 후 교환이나 잠금이 필요한지 결정해야 하며, 메모리 순서 규칙도 언어와 API에 따라 확인해야 합니다.

언제 쓰나

여러 작업이 공유 카운터나 상태 플래그를 안전하게 갱신할 때 씁니다.

페이지로 열기 ↗