Raku의 atomic-assign — 네이티브 정수·Scalar 원자적 대입
Raku의 atomic-assign — 네이티브 정수·Scalar 원자적 대입
여러 스레드가 같은 변수를 건드릴 때, 값을 바꾸는 순간조차 중간 상태가 보이면 안 되는 경우가 있어요. atomic-assign은 그런 상황을 위해 값을 원자적(atomically)으로 대입해 주는 루틴이에요. 대상이 네이티브 정수냐 Scalar냐에 따라 두 가지 형태가 있어요.
atomicint — 네이티브 정수에 대입
multi atomic-assign(atomicint $ is rw, int $value)
multi atomic-assign(atomicint $ is rw, Int() $value)
네이티브 정수에 원자적 대입을 수행해요. 대상은 렉시컬(lexical), 속성(attribute), 또는 네이티브 배열 요소 어디에 있든 괜찮아요. $value가 너무 커서 64비트 네이티브 정수로 풀기(unbox)가 불가능하면 예외를 던져요. atomicint의 크기가 32비트라면, 범위를 벗어난 $value는 조용히 잘려요(truncate). atomic-assign은 필요한 배리어(barrier)를 수행해서 바뀐 값이 다른 스레드에 '게시(published)'되도록 보장해요.
Scalar — Scalar 컨테이너에 대입
multi atomic-assign($target is rw, $value)
Scalar인 $target에 $value를 원자적으로 대입해요. 네이티브 정수 형태와 마찬가지로, 필요한 배리어를 수행해서 바뀐 값이 다른 스레드에 게시되도록 보장해요.
본문
- 네이티브 정수(
atomicint)와Scalar두 대상에 대해 원자적 대입을 지원해요. - 바뀐 값을 다른 스레드가 볼 수 있도록 배리어를 수행해서 '게시'해요.
- 64비트로 못 풀 정도로 큰 값은 예외, 32비트
atomicint범위 초과 값은 조용히 잘려요. atomic-fetch같은 읽기 루틴과 짝을 이뤄 스레드 간 안전한 공유를 만들어요.