...

パッケージ atomic

import "sync/atomic"
概要
目次

概要 ▾

atomic パッケージは,同期アルゴリズムを実装する際に役立つ低レベルのアトミック基本要素を提供します。

これらの関数を正しく使用するには細心の注意が必要です。 特別な,低レベルのアプリケーションを除いて,同期はチャンネルまたは同期パッケージの機能でよりよく行われます。 通信してメモリを共有する。 メモリを共有して通信しないでください。

SwapT 関数によって実装されるスワップ操作は,次のものとアトミック的に等価です。

old = *addr
*addr = new
return old

CompareAndSwapT 関数によって実装される compare-and-swap 操作は,次のものとアトミック的に等価です。

if *addr == old {
	*addr = new
	return true
}
return false

AddT 関数によって実装される追加操作は,次のものとアトミック的に等価です。

*addr += delta
return *addr

LoadT 関数と StoreT 関数によって実装されるロード操作とストア操作は, "return *addr" および "*addr = val" と基本的に同じです。

目次 ▾

func AddInt32(addr *int32, delta int32) (new int32)
func AddInt64(addr *int64, delta int64) (new int64)
func AddUint32(addr *uint32, delta uint32) (new uint32)
func AddUint64(addr *uint64, delta uint64) (new uint64)
func AddUintptr(addr *uintptr, delta uintptr) (new uintptr)
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)
func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)
func CompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)
func CompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)
func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool)
func LoadInt32(addr *int32) (val int32)
func LoadInt64(addr *int64) (val int64)
func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer)
func LoadUint32(addr *uint32) (val uint32)
func LoadUint64(addr *uint64) (val uint64)
func LoadUintptr(addr *uintptr) (val uintptr)
func StoreInt32(addr *int32, val int32)
func StoreInt64(addr *int64, val int64)
func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)
func StoreUint32(addr *uint32, val uint32)
func StoreUint64(addr *uint64, val uint64)
func StoreUintptr(addr *uintptr, val uintptr)
func SwapInt32(addr *int32, new int32) (old int32)
func SwapInt64(addr *int64, new int64) (old int64)
func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)
func SwapUint32(addr *uint32, new uint32) (old uint32)
func SwapUint64(addr *uint64, new uint64) (old uint64)
func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)
type Value
    func (v *Value) Load() (x interface{})
    func (v *Value) Store(x interface{})

Value (Config)
Value (ReadMostly)

パッケージファイル

doc.go value.go

func AddInt32

func AddInt32(addr *int32, delta int32) (new int32)

AddInt32 は, *addr に delta を自動的に追加して新しい値を返します。

func AddInt64

func AddInt64(addr *int64, delta int64) (new int64)

AddInt64 は *addr に delta をアトミックに追加し,新しい値を返します。

func AddUint32

func AddUint32(addr *uint32, delta uint32) (new uint32)

AddUint32 は, *addr に delta を自動的に追加して新しい値を返します。 x から符号付き正の定数 c を減算するには, AddUint32(&x , ^uint32(c-1)) を実行します。 特に, x をデクリメントするには, AddUint32(&x , ^uint32(0)) を実行します。

func AddUint64

func AddUint64(addr *uint64, delta uint64) (new uint64)

AddUint64 は, *addr に delta を自動的に追加して新しい値を返します。 x から符号付き正の定数値 c を減算するには, AddUint64(&x , ^uint64(c-1)) を実行します。 特に, x をデクリメントするには, AddUint64(&x , ^uint64(0)) を実行します。

func AddUintptr

func AddUintptr(addr *uintptr, delta uintptr) (new uintptr)

AddUintptr は, *addr に delta を自動的に追加し,新しい値を返します。

func CompareAndSwapInt32

func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)

CompareAndSwapInt32 は, int32 値に対して比較交換操作を実行します。

func CompareAndSwapInt64

func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)

CompareAndSwapInt64 は, int64 値に対して比較交換操作を実行します。

func CompareAndSwapPointer

func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)

CompareAndSwapPointer は,安全でない .Pointer 値に対して比較と交換操作を実行します。

func CompareAndSwapUint32

func CompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)

CompareAndSwapUint32 は, uint32 値に対して比較と交換操作を実行します。

func CompareAndSwapUint64

func CompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)

CompareAndSwapUint64 は, uint64 値に対して比較と交換操作を実行します。

func CompareAndSwapUintptr

func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool)

CompareAndSwapUintptr は, uintptr 値の比較交換操作を実行します。

func LoadInt32

func LoadInt32(addr *int32) (val int32)

LoadInt32 はアトミックに *addr をロードします。

func LoadInt64

func LoadInt64(addr *int64) (val int64)

LoadInt64 は *addr を自動的にロードします。

func LoadPointer

func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer)

LoadPointer は *addr を自動的にロードします。

func LoadUint32

func LoadUint32(addr *uint32) (val uint32)

LoadUint32 は *addr を自動的にロードします。

func LoadUint64

func LoadUint64(addr *uint64) (val uint64)

LoadUint64 は *addr を自動的にロードします。

func LoadUintptr

func LoadUintptr(addr *uintptr) (val uintptr)

LoadUintptr は *addr を自動的にロードします。

func StoreInt32

func StoreInt32(addr *int32, val int32)

StoreInt32 は val をアトミックに *addr に格納します。

func StoreInt64

func StoreInt64(addr *int64, val int64)

StoreInt64 は val をアトミックに *addr に格納します。

func StorePointer

func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)

StorePointer は val をアトミックに *addr に格納します。

func StoreUint32

func StoreUint32(addr *uint32, val uint32)

StoreUint32 は val をアトミックに *addr に格納します。

func StoreUint64

func StoreUint64(addr *uint64, val uint64)

StoreUint64 は val をアトミックに *addr に格納します。

func StoreUintptr

func StoreUintptr(addr *uintptr, val uintptr)

StoreUintptr は val をアトミックに *addr に格納します。

func SwapInt32 1.2

func SwapInt32(addr *int32, new int32) (old int32)

SwapInt32 は new を *addr にアトミックに格納し,前の *addr 値を返します。

func SwapInt64 1.2

func SwapInt64(addr *int64, new int64) (old int64)

SwapInt64 は new を *addr にアトミックに格納し,前の *addr 値を返します。

func SwapPointer 1.2

func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)

SwapPointer は new を *addr にアトミックに格納し,前の *addr 値を返します。

func SwapUint32 1.2

func SwapUint32(addr *uint32, new uint32) (old uint32)

SwapUint32 は new を *addr に自動的に格納し,前の *addr 値を返します。

func SwapUint64 1.2

func SwapUint64(addr *uint64, new uint64) (old uint64)

SwapUint64 は new を *addr にアトミックに格納し,前の *addr 値を返します。

func SwapUintptr 1.2

func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)

SwapUintptr は new を *addr にアトミックに格納し,前の *addr 値を返します。

type Value 1.4

Value は,一貫した型の値のアトミックロードとストアを提供します。 Value のゼロ値は Load から nil を返します。 Store が呼び出されたら, Value をコピーしてはいけません。

Value は最初の使用後にコピーしてはいけません。

type Value struct {
    // エクスポートされていないフィールドがあります
}

例 (Config)

次の例は,定期的なプログラム構成の更新とワーカーゴルーチンへの変更の伝達に Value を使用する方法を示しています。

コード:

var config atomic.Value // 現在のサーバー構成を保持します
// 初期設定値を作成して設定に格納します。
config.Store(loadConfig())
go func() {
    // 設定を 10 秒ごとにリロードし,新しいバージョンで設定値を更新します。
    for {
        time.Sleep(10 * time.Second)
        config.Store(loadConfig())
    }
}()
// 最新の設定値を使用して着信リクエストを処理するワーカーゴルーチンを作成します。
for i := 0; i < 10; i++ {
    go func() {
        for r := range requests() {
            c := config.Load()
            // 設定 c を使用してリクエスト r を処理します。
            _, _ = r, c
        }
    }()
}

例 (ReadMostly)

次の例は,コピーオンライトイディオムを使用して,スケーラブルで頻繁に読み取られるが,まれにしか更新されないデータ構造を維持する方法を示しています。

コード:

type Map map[string]string
var m atomic.Value
m.Store(make(Map))
var mu sync.Mutex // ライターによってだけ使用される
// 読み取り関数を使用して,さらに同期化せずにデータを読み取ることができます。
read := func(key string) (val string) {
    m1 := m.Load().(Map)
    return m1[key]
}
// 挿入関数を使用して,さらに同期化せずにデータを更新することができます。
insert := func(key, val string) {
    mu.Lock() // 他の潜在的なライターと同期する
    defer mu.Unlock()
    m1 := m.Load().(Map) // データ構造の現在値をロードする
    m2 := make(Map)      // 新しい値を作る
    for k, v := range m1 {
        m2[k] = v // 現在のオブジェクトから新しいオブジェクトにすべてのデータをコピーする
    }
    m2[key] = val // 必要なアップデートを行います
    m.Store(m2)   // 現在のオブジェクトを新しいものとアトミックに置き換えます。
    // この時点で,すべての新しいリーダーが新しいバージョンで作業を開始します。
    // 既存のリーダー(もしあれば)がそれを使い終えたら,古いバージョンはガベージコレクションされます。
}
_, _ = read, insert

func (*Value) Load 1.4

func (v *Value) Load() (x interface{})

Load は最新の Store によって設定された値を返します。 この値に対して Store への呼び出しがなかった場合は nil を返します。

func (*Value) Store 1.4

func (v *Value) Store(x interface{})

Store は Value の値を x に設定します。 特定の値に対する Store の呼び出しはすべて,同じ具象型の値を使用する必要があります。 Store(nil) と同様に,矛盾する型の Store はパニックを起こします。