6.100. kink/thread/ATOMIC

6.100.1. atomic型

atomicは値への参照である。atomicは同期順序 (synchronization order) で順序付けされた読み書き操作を提供する。また、アトミックなcompare-and-set操作を提供する。

6.100.1.1. Atomic.load

loadはAtomicが参照する値を同期操作 (synchronization action) として読み、その値を戻す。

6.100.1.2. Atomic <- New

<- 演算子、またはop_storeメソッドは、Atomicが参照する値としてNewを書き込む。書き込み操作は同期操作 (synchronization action) として行われる。

6.100.1.3. Atomic.compare_and_set(Expected New)

compare_and_setは、Atomicに対してアトミックなcompare-and-set操作を行う。Newが書き込まれた場合、compare_and_setはtrueを戻す。Newが書き込まれなかった場合、compare_and_setはfalseを戻す。

compare_and_setは、参照された値を、loadと同じメモリセマンティクスで読み込む。読み込まれた値がExpectedと同じだった場合、compare_and_setは、NewをAtomicが参照する値として、 <- 演算子と同じメモリセマンティクスで書き込む。読み込まれた値がExpectedと同じでない場合、compare_and_setはfalseを戻す。

6.100.1.4. Atomic.update($compute_new)

updateは、Atomicが参照する値を、現在の値から計算された値に、アトミックに更新するための便利メソッドである。

𝄋 updateは現在の値Oldを、loadのメモリセマンティクスで読み込む。そして、compute_new(Old)を呼んでNewを得る。次に、Oldを期待する現在値として、Newを新しい値として、compare-and-set操作を行う。Newが書き込まれた場合、updateは[Old New]のvec値を戻す。Newが書き込まれなかった場合、updateは𝄋からやりなおす。

事前条件

$compute_newは引数をひとつ取る関数でなければならない。

6.100.2. ATOMIC.new(Initial_val)

newは、Initial_valを参照する新しいatomicを戻す。

6.100.3. ATOMIC.is?(Val)

is?は、Valがatomicであるかどうかを戻す。