查看源代码 atomics (erts v15.2)
原子操作函数
此模块提供了一组函数,用于对可变的原子变量执行原子操作。该实现仅使用原子硬件指令,没有任何软件级别的锁定,这使得它对于并发访问非常高效。原子操作被组织成数组,具有以下语义:
- 原子操作是 64 位整数。
- 原子操作可以表示为有符号或无符号。
- 原子操作在溢出和下溢操作时会回绕。
- 所有操作都保证原子性。看不到中间结果。一次突变的结果只能是下一次突变的输入。
- 所有原子操作都是相互有序的。如果原子 B 在原子 A *之后* 更新,那么对于任何并发读取器,它都会以这种方式出现。没有人可以读取 B 的新值,然后读取 A 的旧值。
- 原子数组的索引是从 1 开始的。一个大小为 N 的原子数组包含 N 个原子,索引从 1 到 N。
摘要
函数
将 Incr
加到原子。
原子地将 Incr
加到原子并返回结果。
原子地将原子与 Expected
进行比较,如果相等,则将原子设置为 Desired
。
原子地将原子值替换为 Desired
并返回先前的值。
读取原子值。
以映射形式返回有关原子数组的信息。
创建一个新的具有 Arity
个原子元素的数组。数组中的所有原子最初都设置为零。
将原子设置为 Value
。
从原子中减去 Decr
。
原子地从原子中减去 Decr
并返回结果。
类型
函数
-spec add(Ref, Ix, Incr) -> ok when Ref :: atomics_ref(), Ix :: integer(), Incr :: integer().
将 Incr
加到原子。
-spec add_get(Ref, Ix, Incr) -> integer() when Ref :: atomics_ref(), Ix :: integer(), Incr :: integer().
原子地将 Incr
加到原子并返回结果。
-spec compare_exchange(Ref, Ix, Expected, Desired) -> ok | integer() when Ref :: atomics_ref(), Ix :: integer(), Expected :: integer(), Desired :: integer().
原子地将原子与 Expected
进行比较,如果相等,则将原子设置为 Desired
。
如果写入了 Desired
,则返回 ok
。如果与 Expected
不相等,则返回实际的原子值。
-spec exchange(Ref, Ix, Desired) -> integer() when Ref :: atomics_ref(), Ix :: integer(), Desired :: integer().
原子地将原子值替换为 Desired
并返回先前的值。
-spec get(Ref, Ix) -> integer() when Ref :: atomics_ref(), Ix :: integer().
读取原子值。
-spec info(Ref) -> Info when Ref :: atomics_ref(), Info :: #{size := Size, max := Max, min := Min, memory := Memory}, Size :: non_neg_integer(), Max :: integer(), Min :: integer(), Memory :: non_neg_integer().
以映射形式返回有关原子数组的信息。
映射具有以下键
size
- 数组中原子的数量。max
- 此数组中的原子可以保持的最大可能值。min
- 此数组中的原子可以保持的最小可能值。memory
- 数组的大概内存消耗(以字节为单位)。
-spec new(Arity, Opts) -> atomics_ref() when Arity :: pos_integer(), Opts :: [Opt], Opt :: {signed, boolean()}.
创建一个新的具有 Arity
个原子元素的数组。数组中的所有原子最初都设置为零。
参数 Opts
是以下可能的选项列表:
{signed, boolean()}
- 指示数组的元素将被视为有符号还是无符号整数。默认值为true
(有符号)。有符号原子的整数区间是从
-(1 bsl 63)
到(1 bsl 63)-1
,无符号原子的整数区间是从0
到(1 bsl 64)-1
。
原子操作不与当前进程绑定,当它们不再被引用时,会自动进行垃圾回收。
-spec put(Ref, Ix, Value) -> ok when Ref :: atomics_ref(), Ix :: integer(), Value :: integer().
将原子设置为 Value
。
-spec sub(Ref, Ix, Decr) -> ok when Ref :: atomics_ref(), Ix :: integer(), Decr :: integer().
从原子中减去 Decr
。
-spec sub_get(Ref, Ix, Decr) -> integer() when Ref :: atomics_ref(), Ix :: integer(), Decr :: integer().
原子地从原子中减去 Decr
并返回结果。