`ATOMIC_CAS` — 원자적 비교-교환

ATOMIC_CAS — 원자적 비교-교환

여러 이미지(image)가 같은 변수를 동시에 건드리면 '읽고, 비교하고, 바꾸는' 사이에 다른 이미지가 끼어들어 결과가 꼬일 수 있어요. 그래서 이 세 동작을 중간에 간섭받지 않도록 한 번에 처리할 필요가 있는데요, 그걸 위한 루틴이 atomic_cas예요. 'cas'는 compare and swap의 약자랍니다.

출처: gfortran 문서 — ATOMIC_CAS

본문

시그니처

CALL ATOMIC_CAS (ATOM, OLD, COMPARE, NEW [, STAT])

설명

ATOMIC_CAS는 변수 ATOMCOMPARE의 값과 비교해요. 값이 서로 같으면 ATOMNEW의 값으로 설정하고, 비교에 사용한 ATOM의 원래 값을 OLD에 담아요.

STAT가 주어지고 호출이 성공하면 STAT에 0을 넣어요. 호출이 실패하면 양수 값을 넣는데, coindexed ATOM의 경우 원격 이미지(remote image)가 멈췄다면 ISO_FORTRAN_ENVSTAT_STOPPED_IMAGE 값, 실패했다면 STAT_FAILED_IMAGE 값을 넣어요.

분류

원자적 서브루틴(Atomic subroutine)

인자

  • ATOMATOMIC_INT_KIND 종류의 정수형이거나 ATOMIC_LOGICAL_KIND 종류의 논리형인 스칼라 코어레이(coarray) 또는 coindexed 변수.
  • OLDATOM과 같은 타입·종류(kind)의 스칼라.
  • COMPAREATOM과 같은 타입·종류의 스칼라 변수.
  • NEWATOM과 같은 타입의 스칼라 변수. 종류가 다르면 ATOM의 종류로 변환돼요.
  • STAT (선택) — 기본 종류(default kind) 정수형 스칼라 변수.

예제

program atomic
  use iso_fortran_env
  logical(atomic_logical_kind) :: atom[*], prev
  call atomic_cas (atom[1], prev, .false., .true.)
end program atomic

이 예제는 atom[1]의 값이 .false..true.로 바꾸고, 비교에 쓰인 원래 값을 prev에 담아요.

표준

TS 18508 이상

함께 보기