Documentation
¶
Overview ¶
パッケージatomicは、同期アルゴリズムの実装に役立つ 低レベルのアトミックメモリプリミティブを提供します。
これらの関数は、正しく使用するためには非常に注意が必要です。 特別な低レベルのアプリケーションを除き、同期はチャネルや[sync]パッケージの機能を 使用して行う方が良いです。 メモリを共有するために通信を行い、 メモリを共有するために通信を行わないでください。
SwapT関数によって実装されるスワップ操作は、アトミックの 相当するものです:
old = *addr *addr = new return old
CompareAndSwapT関数によって実装される比較交換操作は、アトミックの 相当するものです:
if *addr == old { *addr = new return true } return false
AddT関数によって実装される加算操作は、アトミックの 相当するものです:
*addr += delta return *addr
LoadTおよびStoreT関数によって実装されるロードおよびストア操作は、 "return *addr"および"*addr = val"のアトミック相当です。
Goのメモリモデルの用語では、アトミック操作Aの効果が アトミック操作Bによって観察される場合、AはBの前に「同期する」。 さらに、プログラムで実行されるすべてのアトミック操作は、 あたかも一貫した順序で実行されるかのように振る舞います。 この定義は、C++の一貫性のあるアトミックとJavaのvolatile変数と 同じセマンティクスを提供します。
Index ¶
- 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 Bool
- type Int32
- type Int64
- type Pointer
- type Uint32
- type Uint64
- type Uintptr
- type Value
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AddInt64 ¶
AddInt64はアトミックにdeltaを*addrに加え、新しい値を返します。 より使いやすく、エラーが発生しにくい Int64.Add の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func AddUint32 ¶
AddUint32はアトミックにdeltaを*addrに加え、新しい値を返します。 xから符号付き正の定数値cを減算するには、AddUint32(&x, ^uint32(c-1))を行います。 特に、xをデクリメントするには、AddUint32(&x, ^uint32(0))を行います。 より使いやすく、エラーが発生しにくい Uint32.Add の使用を検討してください。
func AddUint64 ¶
AddUint64はアトミックにdeltaを*addrに加え、新しい値を返します。 xから符号付き正の定数値cを減算するには、AddUint64(&x, ^uint64(c-1))を行います。 特に、xをデクリメントするには、AddUint64(&x, ^uint64(0))を行います。 より使いやすく、エラーが発生しにくい Uint64.Add の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func AddUintptr ¶
AddUintptrはアトミックにdeltaを*addrに加え、新しい値を返します。 より使いやすく、エラーが発生しにくい Uintptr.Add の使用を検討してください。
func CompareAndSwapInt32 ¶
CompareAndSwapInt32は、int32値のための比較交換操作を実行します。 より使いやすく、エラーが発生しにくい Int32.CompareAndSwap の使用を検討してください。
func CompareAndSwapInt64 ¶
CompareAndSwapInt64は、int64値のための比較交換操作を実行します。 より使いやすく、エラーが発生しにくい Int64.CompareAndSwap の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func CompareAndSwapPointer ¶
CompareAndSwapPointerは、unsafe.Pointer値のための比較交換操作を実行します。 より使いやすく、エラーが発生しにくい Pointer.CompareAndSwap の使用を検討してください。
func CompareAndSwapUint32 ¶
CompareAndSwapUint32は、uint32値のための比較交換操作を実行します。 より使いやすく、エラーが発生しにくい Uint32.CompareAndSwap の使用を検討してください。
func CompareAndSwapUint64 ¶
CompareAndSwapUint64は、uint64値のための比較交換操作を実行します。 より使いやすく、エラーが発生しにくい Uint64.CompareAndSwap の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func CompareAndSwapUintptr ¶
CompareAndSwapUintptrは、uintptr値のための比較交換操作を実行します。 より使いやすく、エラーが発生しにくい Uintptr.CompareAndSwap の使用を検討してください。
func LoadInt32 ¶
LoadInt32はアトミックに*addrをロードします。 より使いやすく、エラーが発生しにくい Int32.Load の使用を検討してください。
func LoadInt64 ¶
LoadInt64はアトミックに*addrをロードします。 より使いやすく、エラーが発生しにくい Int64.Load の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func LoadPointer ¶
LoadPointerはアトミックに*addrをロードします。 より使いやすく、エラーが発生しにくい Pointer.Load の使用を検討してください。
func LoadUint32 ¶
LoadUint32はアトミックに*addrをロードします。 より使いやすく、エラーが発生しにくい Uint32.Load の使用を検討してください。
func LoadUint64 ¶
LoadUint64はアトミックに*addrをロードします。 より使いやすく、エラーが発生しにくい Uint64.Load の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func LoadUintptr ¶
LoadUintptrはアトミックに*addrをロードします。 より使いやすく、エラーが発生しにくい Uintptr.Load の使用を検討してください。
func StoreInt32 ¶
StoreInt32はアトミックにvalを*addrに格納します。 より使いやすく、エラーが発生しにくい Int32.Store の使用を検討してください。
func StoreInt64 ¶
StoreInt64はアトミックにvalを*addrに格納します。 より使いやすく、エラーが発生しにくい Int64.Store の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func StorePointer ¶
StorePointerはアトミックにvalを*addrに格納します。 より使いやすく、エラーが発生しにくい Pointer.Store の使用を検討してください。
func StoreUint32 ¶
StoreUint32はアトミックにvalを*addrに格納します。 より使いやすく、エラーが発生しにくい Uint32.Store の使用を検討してください。
func StoreUint64 ¶
StoreUint64はアトミックにvalを*addrに格納します。 より使いやすく、エラーが発生しにくい Uint64.Store の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func StoreUintptr ¶
StoreUintptrはアトミックにvalを*addrに格納します。 より使いやすく、エラーが発生しにくい Uintptr.Store の使用を検討してください。
func SwapInt32 ¶ added in v1.2.0
SwapInt32はアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 より使いやすく、エラーが発生しにくい Int32.Swap の使用を検討してください。
func SwapInt64 ¶ added in v1.2.0
SwapInt64はアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 より使いやすく、エラーが発生しにくい Int64.Swap の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func SwapPointer ¶ added in v1.2.0
SwapPointerはアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 より使いやすく、エラーが発生しにくい Pointer.Swap の使用を検討してください。
func SwapUint32 ¶ added in v1.2.0
SwapUint32はアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 より使いやすく、エラーが発生しにくい Uint32.Swap の使用を検討してください。
func SwapUint64 ¶ added in v1.2.0
SwapUint64はアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 より使いやすく、エラーが発生しにくい Uint64.Swap の使用を検討してください (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。
func SwapUintptr ¶ added in v1.2.0
SwapUintptrはアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 より使いやすく、エラーが発生しにくい Uintptr.Swap の使用を検討してください。
Types ¶
type Bool ¶ added in v1.19.0
type Bool struct {
// contains filtered or unexported fields
}
Boolはアトミックなブーリアン値です。 ゼロ値はfalseです。
func (*Bool) CompareAndSwap ¶ added in v1.19.0
CompareAndSwapは、ブール値xの比較交換操作を実行します。
type Int32 ¶ added in v1.19.0
type Int32 struct {
// contains filtered or unexported fields
}
Int32はアトミックなint32です。ゼロ値はゼロです。
func (*Int32) CompareAndSwap ¶ added in v1.19.0
CompareAndSwapは、xの比較交換操作を実行します。
type Int64 ¶ added in v1.19.0
type Int64 struct {
// contains filtered or unexported fields
}
Int64はアトミックなint64です。ゼロ値はゼロです。
func (*Int64) CompareAndSwap ¶ added in v1.19.0
CompareAndSwapは、xの比較交換操作を実行します。
type Pointer ¶ added in v1.19.0
type Pointer[T any] struct { // contains filtered or unexported fields }
Pointerはタイプ*Tのアトミックポインタです。ゼロ値はnil *Tです。
func (*Pointer[T]) CompareAndSwap ¶ added in v1.19.0
CompareAndSwapは、ポインタxの比較交換操作を実行します。
func (*Pointer[T]) Load ¶ added in v1.19.0
func (x *Pointer[T]) Load() *T
Loadはアトミックにxに格納されている値をロードして返します。
type Uint32 ¶ added in v1.19.0
type Uint32 struct {
// contains filtered or unexported fields
}
Uint32はアトミックなuint32です。ゼロ値はゼロです。
func (*Uint32) CompareAndSwap ¶ added in v1.19.0
CompareAndSwapは、xの比較交換操作を実行します。
type Uint64 ¶ added in v1.19.0
type Uint64 struct {
// contains filtered or unexported fields
}
Uint64はアトミックなuint64です。ゼロ値はゼロです。
func (*Uint64) CompareAndSwap ¶ added in v1.19.0
CompareAndSwapは、xの比較交換操作を実行します。
type Uintptr ¶ added in v1.19.0
type Uintptr struct {
// contains filtered or unexported fields
}
Uintptrはアトミックなuintptrです。ゼロ値はゼロです。
func (*Uintptr) CompareAndSwap ¶ added in v1.19.0
CompareAndSwapは、xの比較交換操作を実行します。
type Value ¶ added in v1.4.0
type Value struct {
// contains filtered or unexported fields
}
Valueは、一貫した型の値のアトミックなロードとストアを提供します。 Valueのゼロ値はLoadからnilを返します。 Storeが呼び出された後、Valueはコピーしてはなりません。
最初の使用後、Valueはコピーしてはなりません。
Example (Config) ¶
次の例は、Valueを使用して定期的なプログラム設定の更新と 変更のワーカーゴルーチンへの伝播を行う方法を示しています。
var config atomic.Value // 現在のサーバー設定を保持します // 初期設定値を作成し、configに格納します。 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 } }() }
Output:
Example (ReadMostly) ¶
次の例は、コピーオンライトのイディオムを使用して、 頻繁に読み取られるが、あまり更新されないデータ構造を維持する方法を示しています。
package main import ( "github.com/shogo82148/std/sync" "github.com/shogo82148/std/sync/atomic" ) func main() { type Map map[string]string var m atomic.Value m.Store(make(Map)) var mu sync.Mutex // 書き込み者のみが使用します // read関数は、さらなる同期化なしでデータを読み取るために使用できます read := func(key string) (val string) { m1 := m.Load().(Map) return m1[key] } // insert関数は、さらなる同期化なしでデータを更新するために使用できます 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 }
Output:
func (*Value) CompareAndSwap ¶ added in v1.17.0
CompareAndSwapは、Valueの比較交換操作を実行します。
与えられたValueに対するCompareAndSwapのすべての呼び出しは、同じ具体的な型の値を使用しなければなりません。 不一致の型をCompareAndSwapするとパニックを引き起こし、CompareAndSwap(old, nil)も同様です。
func (*Value) Load ¶ added in v1.4.0
Loadは、最も最近のStoreによって設定された値を返します。 このValueに対してStoreの呼び出しがない場合、nilを返します。