檢視原始碼 atomics (erts v15.2)

原子操作函數

此模組提供一組函數,用於對可變的原子變數執行原子操作。此實作僅使用原子硬體指令,不使用任何軟體層級的鎖定,使其在並行存取時非常有效率。原子操作以陣列形式組織,具有以下語意:

  • 原子操作是 64 位元整數。
  • 原子操作可以表示為帶符號或不帶符號。
  • 原子操作在溢位和下溢操作時會環繞。
  • 所有操作皆保證原子性。不會看到中間結果。一個變更的結果只能是下一個變更的輸入。
  • 所有原子操作都相互排序。如果原子操作 B 在原子操作 A 之後更新,則任何並行讀取器都會看到這種情況。沒有人可以先讀取 B 的新值,然後讀取 A 的舊值。
  • 原子陣列的索引從 1 開始。一個大小為 N 的原子陣列包含 N 個原子操作,索引從 1 到 N。

摘要

型別

識別從 new/2 傳回的原子陣列。

函數

Incr 加到原子操作。

原子地將 Incr 加到原子操作並傳回結果。

原子地將原子操作與 Expected 比較,如果相等,則將原子操作設定為 Desired

原子地將原子操作的值替換為 Desired 並傳回先前的值。

讀取原子操作的值。

以 map 形式傳回有關原子陣列的資訊。

建立一個新的 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().

以 map 形式傳回有關原子陣列的資訊。

map 具有以下鍵:

  • 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 並傳回結果。