`ATOMIC_CAS` — 원자적 비교-교환
ATOMIC_CAS — 원자적 비교-교환
여러 이미지(image)가 같은 변수를 동시에 건드리면 '읽고, 비교하고, 바꾸는' 사이에 다른 이미지가 끼어들어 결과가 꼬일 수 있어요. 그래서 이 세 동작을 중간에 간섭받지 않도록 한 번에 처리할 필요가 있는데요, 그걸 위한 루틴이 atomic_cas예요. 'cas'는 compare and swap의 약자랍니다.
본문
시그니처
CALL ATOMIC_CAS (ATOM, OLD, COMPARE, NEW [, STAT])
설명
ATOMIC_CAS는 변수 ATOM을 COMPARE의 값과 비교해요. 값이 서로 같으면 ATOM을 NEW의 값으로 설정하고, 비교에 사용한 ATOM의 원래 값을 OLD에 담아요.
STAT가 주어지고 호출이 성공하면 STAT에 0을 넣어요. 호출이 실패하면 양수 값을 넣는데, coindexed ATOM의 경우 원격 이미지(remote image)가 멈췄다면 ISO_FORTRAN_ENV의 STAT_STOPPED_IMAGE 값, 실패했다면 STAT_FAILED_IMAGE 값을 넣어요.
분류
원자적 서브루틴(Atomic subroutine)
인자
ATOM—ATOMIC_INT_KIND종류의 정수형이거나ATOMIC_LOGICAL_KIND종류의 논리형인 스칼라 코어레이(coarray) 또는 coindexed 변수.OLD—ATOM과 같은 타입·종류(kind)의 스칼라.COMPARE—ATOM과 같은 타입·종류의 스칼라 변수.NEW—ATOM과 같은 타입의 스칼라 변수. 종류가 다르면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 이상
함께 보기
- ATOMIC_DEFINE — 변수를 원자적으로 설정
- ATOMIC_REF — 변수의 값을 원자적으로 얻기
ISO_FORTRAN_ENV