Raku의 atomic-fetch-sub — 하드웨어 원자적 뺄셈
Raku의 atomic-fetch-sub — 하드웨어 원자적 뺄셈
atomic-fetch-inc가 1을 더하는 원자적 연산이라면, atomic-fetch-sub은 네이티브 정수에 원자적 뺄셈을 수행해요. 역시 증가 전의 값을 돌려받는 방식과 같은 흐름이에요.
multi atomic-fetch-sub(atomicint $ is rw, int $value)
multi atomic-fetch-sub(atomicint $ is rw, Int() $value)
여러 스레드가 공유하는 카운터에서 값을 빼야 하는데 중간값 경합이 걱정될 때 쓸 수 있어요. 하드웨어 제공 원자적 연산으로 동작하므로 락을 걸지 않고도 안전해요. 반환값은 뺄셈을 수행하기 전에 본 값이고, 언더플로(underflow)는 조용히 감싸져요.
주의할 점이 몇 가지 있어요. $value가 64비트 정수로 풀기(unbox)에 너무 크면 예외가 나요. 그리고 $value가 atomicint의 범위를 넘어 넘치면, 뺄셈을 하기 전에 조용히 잘려요(truncate).
본문
- 첫 번째 시그너처는
int $value를, 두 번째는Int()강제 변환되는 값을 받아요. - 락 없이 스레드 안전하게 원자적 뺄셈을 수행하고, 뺄셈 전 값을 돌려줘요.
- 값이 너무 크면 예외, 범위 초과 시 조용히 잘리니 입력 크기에 주의하세요.