檢視原始碼 atomics (erts v15.2)
原子操作函數
此模組提供一組函數,用於對可變的原子變數執行原子操作。此實作僅使用原子硬體指令,不使用任何軟體層級的鎖定,使其在並行存取時非常有效率。原子操作以陣列形式組織,具有以下語意:
- 原子操作是 64 位元整數。
- 原子操作可以表示為帶符號或不帶符號。
- 原子操作在溢位和下溢操作時會環繞。
- 所有操作皆保證原子性。不會看到中間結果。一個變更的結果只能是下一個變更的輸入。
- 所有原子操作都相互排序。如果原子操作 B 在原子操作 A 之後更新,則任何並行讀取器都會看到這種情況。沒有人可以先讀取 B 的新值,然後讀取 A 的舊值。
- 原子陣列的索引從 1 開始。一個大小為 N 的原子陣列包含 N 個原子操作,索引從 1 到 N。
摘要
函數
將 Incr
加到原子操作。
原子地將 Incr
加到原子操作並傳回結果。
原子地將原子操作與 Expected
比較,如果相等,則將原子操作設定為 Desired
。
原子地將原子操作的值替換為 Desired
並傳回先前的值。
讀取原子操作的值。
以 map 形式傳回有關原子陣列的資訊。
建立一個新的 Arity
個原子操作的陣列。陣列中的所有原子操作最初都設定為零。
將原子操作設定為 Value
。
從原子操作中減去 Decr
。
原子地從原子操作中減去 Decr
並傳回結果。
型別
-opaque atomics_ref()
識別從 new/2
傳回的原子陣列。
函數
-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().
以 map 形式傳回有關原子陣列的資訊。
map 具有以下鍵:
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
並傳回結果。