Atomics¶
Atomic variables are variables that support atomic operations. Chapel currently supports atomic operations for bools, all supported sizes of signed and unsigned integers, as well as all supported sizes of reals.
Most atomic methods accept an optional argument named order
of type
memory_order
. The order
argument is used to specify the ordering
constraints of atomic operations. The supported values are:
 memory_order_relaxed
 memory_order_acquire
 memory_order_release
 memory_order_acq_rel
 memory_order_seq_cst

atomic (bool)

proc
read
(order: memory_order = memory_order_seq_cst): bool¶ Returns: The stored value.

proc
write
(value: bool, order: memory_order = memory_order_seq_cst): void¶ Stores value as the new value.

proc
exchange
(value: bool, order: memory_order = memory_order_seq_cst): bool¶ Stores value as the new value and returns the original value.

proc
compareExchange
(expected: bool, desired: bool, order: memory_order = memory_order_seq_cst): bool¶ Equivalent to
compareExchangeStrong

proc
compareExchangeWeak
(expected: bool, desired: bool, order: memory_order = memory_order_seq_cst): bool¶ Similar to
compareExchangeStrong
, except that this function may return false even if the original value was equal to expected. This may happen if the value could not be updated atomically.

proc
compareExchangeStrong
(expected: bool, desired: bool, order: memory_order = memory_order_seq_cst): bool¶ Stores desired as the new value, if and only if the original value is equal to expected. Returns true if desired was stored.

proc
testAndSet
(order: memory_order = memory_order_seq_cst): bool¶ Stores true as the new value and returns the old value.

proc
clear
(order: memory_order = memory_order_seq_cst): void¶ Stores false as the new value.

proc
waitFor
(value: bool, order: memory_order = memory_order_seq_cst): void¶ Arguments: value  Value to compare against. Waits until the stored value is equal to value. The implementation may yield the running task while waiting.

proc
peek
(): bool¶ Returns: Stored value using memory_order_relaxed.

proc
poke
(value: bool): void¶ Stores value as the new value using memory_order_relaxed.

proc

atomic (T)

proc
read
(order: memory_order = memory_order_seq_cst): T Returns: The stored value.

proc
write
(value: T, order: memory_order = memory_order_seq_cst): void Stores value as the new value.

proc
exchange
(value: T, order: memory_order = memory_order_seq_cst): T Stores value as the new value and returns the original value.

proc
compareExchange
(expected: T, desired: T, order: memory_order = memory_order_seq_cst): bool Equivalent to
compareExchangeStrong

proc
compareExchangeWeak
(expected: T, desired: T, order: memory_order = memory_order_seq_cst): bool Similar to
compareExchangeStrong
, except that this function may return false even if the original value was equal to expected. This may happen if the value could not be updated atomically.

proc
compareExchangeStrong
(expected: T, desired: T, order: memory_order = memory_order_seq_cst): bool Stores desired as the new value, if and only if the original value is equal to expected. Returns true if desired was stored.

proc
fetchAdd
(value: T, order: memory_order = memory_order_seq_cst): T¶ Returns: The original value. Adds value to the original value and stores the result. Defined for integer and real atomic types.

proc
add
(value: T, order: memory_order = memory_order_seq_cst): void¶ Adds value to the original value and stores the result. Defined for integer and real atomic types.

proc
fetchSub
(value: T, order: memory_order = memory_order_seq_cst): T¶ Returns: The original value. Subtracts value from the original value and stores the result. Defined for integer and real atomic types.

proc
sub
(value: T, order: memory_order = memory_order_seq_cst): void¶ Subtracts value from the original value and stores the result. Defined for integer and real atomic types.

proc
fetchOr
(value: T, order: memory_order = memory_order_seq_cst): T¶ Returns: The original value. Applies the

operator to value and the original value, then stores the result.Only defined for integer atomic types.

proc
or
(value: T, order: memory_order = memory_order_seq_cst): void¶ Applies the

operator to value and the original value, then stores the result.Only defined for integer atomic types.

proc
fetchAnd
(value: T, order: memory_order = memory_order_seq_cst): T¶ Returns: The original value. Applies the
&
operator to value and the original value, then stores the result.Only defined for integer atomic types.

proc
and
(value: T, order: memory_order = memory_order_seq_cst): void¶ Applies the
&
operator to value and the original value, then stores the result.Only defined for integer atomic types.

proc
fetchXor
(value: T, order: memory_order = memory_order_seq_cst): T¶ Returns: The original value. Applies the
^
operator to value and the original value, then stores the result.Only defined for integer atomic types.

proc
xor
(value: T, order: memory_order = memory_order_seq_cst): void¶ Applies the
^
operator to value and the original value, then stores the result.Only defined for integer atomic types.

proc
waitFor
(value: T, order: memory_order = memory_order_seq_cst): void Waits until the stored value is equal to value. The implementation may yield the running task while waiting.

proc
peek
(): T Returns: Stored value using memory_order_relaxed.

proc
poke
(value: T): void Stores value as the new value using memory_order_relaxed.

proc