查看源代码 atomics (erts v15.2)

原子操作函数

此模块提供了一组函数,用于对可变的原子变量执行原子操作。该实现仅使用原子硬件指令,没有任何软件级别的锁定,这使得它对于并发访问非常高效。原子操作被组织成数组,具有以下语义:

  • 原子操作是 64 位整数。
  • 原子操作可以表示为有符号或无符号。
  • 原子操作在溢出和下溢操作时会回绕。
  • 所有操作都保证原子性。看不到中间结果。一次突变的结果只能是下一次突变的输入。
  • 所有原子操作都是相互有序的。如果原子 B 在原子 A *之后* 更新,那么对于任何并发读取器,它都会以这种方式出现。没有人可以读取 B 的新值,然后读取 A 的旧值。
  • 原子数组的索引是从 1 开始的。一个大小为 N 的原子数组包含 N 个原子,索引从 1 到 N。

摘要

类型

标识从 new/2 返回的原子数组。

函数

Incr 加到原子。

原子地将 Incr 加到原子并返回结果。

原子地将原子与 Expected 进行比较,如果相等,则将原子设置为 Desired

原子地将原子值替换为 Desired 并返回先前的值。

读取原子值。

以映射形式返回有关原子数组的信息。

创建一个新的具有 Arity 个原子元素的数组。数组中的所有原子最初都设置为零。

将原子设置为 Value

从原子中减去 Decr

原子地从原子中减去 Decr 并返回结果。

类型

链接到此不透明类型

atomics_ref()

查看源代码 (自 OTP 21.2 起)
-opaque atomics_ref()

标识从 new/2 返回的原子数组。

函数

链接到此函数

add(Ref, Ix, Incr)

查看源代码 (自 OTP 21.2 起)
-spec add(Ref, Ix, Incr) -> ok when Ref :: atomics_ref(), Ix :: integer(), Incr :: integer().

Incr 加到原子。

链接到此函数

add_get(Ref, Ix, Incr)

查看源代码 (自 OTP 21.2 起)
-spec add_get(Ref, Ix, Incr) -> integer() when Ref :: atomics_ref(), Ix :: integer(), Incr :: integer().

原子地将 Incr 加到原子并返回结果。

链接到此函数

compare_exchange(Ref, Ix, Expected, Desired)

查看源代码 (自 OTP 21.2 起)
-spec compare_exchange(Ref, Ix, Expected, Desired) -> ok | integer()
                          when
                              Ref :: atomics_ref(),
                              Ix :: integer(),
                              Expected :: integer(),
                              Desired :: integer().

原子地将原子与 Expected 进行比较,如果相等,则将原子设置为 Desired

如果写入了 Desired,则返回 ok。如果与 Expected 不相等,则返回实际的原子值。

链接到此函数

exchange(Ref, Ix, Desired)

查看源代码 (自 OTP 21.2 起)
-spec exchange(Ref, Ix, Desired) -> integer()
                  when Ref :: atomics_ref(), Ix :: integer(), Desired :: integer().

原子地将原子值替换为 Desired 并返回先前的值。

链接到此函数

get(Ref, Ix)

查看源代码 (自 OTP 21.2 起)
-spec get(Ref, Ix) -> integer() when Ref :: atomics_ref(), Ix :: integer().

读取原子值。

链接到此函数

info(Ref)

查看源代码 (自 OTP 21.2 起)
-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 - 数组的大概内存消耗(以字节为单位)。
链接到此函数

new(Arity, Opts)

查看源代码 (自 OTP 21.2 起)
-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

原子操作不与当前进程绑定,当它们不再被引用时,会自动进行垃圾回收。

链接到此函数

put(Ref, Ix, Value)

查看源代码 (自 OTP 21.2 起)
-spec put(Ref, Ix, Value) -> ok when Ref :: atomics_ref(), Ix :: integer(), Value :: integer().

将原子设置为 Value

链接到此函数

sub(Ref, Ix, Decr)

查看源代码 (自 OTP 21.2 起)
-spec sub(Ref, Ix, Decr) -> ok when Ref :: atomics_ref(), Ix :: integer(), Decr :: integer().

从原子中减去 Decr

链接到此函数

sub_get(Ref, Ix, Decr)

查看源代码 (自 OTP 21.2 起)
-spec sub_get(Ref, Ix, Decr) -> integer() when Ref :: atomics_ref(), Ix :: integer(), Decr :: integer().

原子地从原子中减去 Decr 并返回结果。