github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/sync/atomic/doc.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // パッケージatomicは、同期アルゴリズムの実装に役立つ 6 // 低レベルのアトミックメモリプリミティブを提供します。 7 // 8 // これらの関数は、正しく使用するためには非常に注意が必要です。 9 // 特別な低レベルのアプリケーションを除き、同期はチャネルや[sync]パッケージの機能を 10 // 使用して行う方が良いです。 11 // メモリを共有するために通信を行い、 12 // メモリを共有するために通信を行わないでください。 13 // 14 // SwapT関数によって実装されるスワップ操作は、アトミックの 15 // 相当するものです: 16 // 17 // old = *addr 18 // *addr = new 19 // return old 20 // 21 // CompareAndSwapT関数によって実装される比較交換操作は、アトミックの 22 // 相当するものです: 23 // 24 // if *addr == old { 25 // *addr = new 26 // return true 27 // } 28 // return false 29 // 30 // AddT関数によって実装される加算操作は、アトミックの 31 // 相当するものです: 32 // 33 // *addr += delta 34 // return *addr 35 // 36 // LoadTおよびStoreT関数によって実装されるロードおよびストア操作は、 37 // "return *addr"および"*addr = val"のアトミック相当です。 38 // 39 // Goのメモリモデルの用語では、アトミック操作Aの効果が 40 // アトミック操作Bによって観察される場合、AはBの前に「同期する」。 41 // さらに、プログラムで実行されるすべてのアトミック操作は、 42 // あたかも一貫した順序で実行されるかのように振る舞います。 43 // この定義は、C++の一貫性のあるアトミックとJavaのvolatile変数と 44 // 同じセマンティクスを提供します。 45 package atomic 46 47 import ( 48 "github.com/shogo82148/std/unsafe" 49 ) 50 51 // SwapInt32はアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 52 // より使いやすく、エラーが発生しにくい [Int32.Swap] の使用を検討してください。 53 func SwapInt32(addr *int32, new int32) (old int32) 54 55 // SwapInt64はアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 56 // より使いやすく、エラーが発生しにくい [Int64.Swap] の使用を検討してください 57 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 58 func SwapInt64(addr *int64, new int64) (old int64) 59 60 // SwapUint32はアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 61 // より使いやすく、エラーが発生しにくい [Uint32.Swap] の使用を検討してください。 62 func SwapUint32(addr *uint32, new uint32) (old uint32) 63 64 // SwapUint64はアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 65 // より使いやすく、エラーが発生しにくい [Uint64.Swap] の使用を検討してください 66 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 67 func SwapUint64(addr *uint64, new uint64) (old uint64) 68 69 // SwapUintptrはアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 70 // より使いやすく、エラーが発生しにくい [Uintptr.Swap] の使用を検討してください。 71 func SwapUintptr(addr *uintptr, new uintptr) (old uintptr) 72 73 // SwapPointerはアトミックに新しい値を*addrに格納し、前の*addrの値を返します。 74 // より使いやすく、エラーが発生しにくい [Pointer.Swap] の使用を検討してください。 75 func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer) 76 77 // CompareAndSwapInt32は、int32値のための比較交換操作を実行します。 78 // より使いやすく、エラーが発生しにくい [Int32.CompareAndSwap] の使用を検討してください。 79 func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool) 80 81 // CompareAndSwapInt64は、int64値のための比較交換操作を実行します。 82 // より使いやすく、エラーが発生しにくい [Int64.CompareAndSwap] の使用を検討してください 83 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 84 func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool) 85 86 // CompareAndSwapUint32は、uint32値のための比較交換操作を実行します。 87 // より使いやすく、エラーが発生しにくい [Uint32.CompareAndSwap] の使用を検討してください。 88 func CompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool) 89 90 // CompareAndSwapUint64は、uint64値のための比較交換操作を実行します。 91 // より使いやすく、エラーが発生しにくい [Uint64.CompareAndSwap] の使用を検討してください 92 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 93 func CompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool) 94 95 // CompareAndSwapUintptrは、uintptr値のための比較交換操作を実行します。 96 // より使いやすく、エラーが発生しにくい [Uintptr.CompareAndSwap] の使用を検討してください。 97 func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool) 98 99 // CompareAndSwapPointerは、unsafe.Pointer値のための比較交換操作を実行します。 100 // より使いやすく、エラーが発生しにくい [Pointer.CompareAndSwap] の使用を検討してください。 101 func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool) 102 103 // AddInt32はアトミックにdeltaを*addrに加え、新しい値を返します。 104 // より使いやすく、エラーが発生しにくい [Int32.Add] の使用を検討してください。 105 func AddInt32(addr *int32, delta int32) (new int32) 106 107 // AddUint32はアトミックにdeltaを*addrに加え、新しい値を返します。 108 // xから符号付き正の定数値cを減算するには、AddUint32(&x, ^uint32(c-1))を行います。 109 // 特に、xをデクリメントするには、AddUint32(&x, ^uint32(0))を行います。 110 // より使いやすく、エラーが発生しにくい [Uint32.Add] の使用を検討してください。 111 func AddUint32(addr *uint32, delta uint32) (new uint32) 112 113 // AddInt64はアトミックにdeltaを*addrに加え、新しい値を返します。 114 // より使いやすく、エラーが発生しにくい [Int64.Add] の使用を検討してください 115 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 116 func AddInt64(addr *int64, delta int64) (new int64) 117 118 // AddUint64はアトミックにdeltaを*addrに加え、新しい値を返します。 119 // xから符号付き正の定数値cを減算するには、AddUint64(&x, ^uint64(c-1))を行います。 120 // 特に、xをデクリメントするには、AddUint64(&x, ^uint64(0))を行います。 121 // より使いやすく、エラーが発生しにくい [Uint64.Add] の使用を検討してください 122 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 123 func AddUint64(addr *uint64, delta uint64) (new uint64) 124 125 // AddUintptrはアトミックにdeltaを*addrに加え、新しい値を返します。 126 // より使いやすく、エラーが発生しにくい [Uintptr.Add] の使用を検討してください。 127 func AddUintptr(addr *uintptr, delta uintptr) (new uintptr) 128 129 // LoadInt32はアトミックに*addrをロードします。 130 // より使いやすく、エラーが発生しにくい [Int32.Load] の使用を検討してください。 131 func LoadInt32(addr *int32) (val int32) 132 133 // LoadInt64はアトミックに*addrをロードします。 134 // より使いやすく、エラーが発生しにくい [Int64.Load] の使用を検討してください 135 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 136 func LoadInt64(addr *int64) (val int64) 137 138 // LoadUint32はアトミックに*addrをロードします。 139 // より使いやすく、エラーが発生しにくい [Uint32.Load] の使用を検討してください。 140 func LoadUint32(addr *uint32) (val uint32) 141 142 // LoadUint64はアトミックに*addrをロードします。 143 // より使いやすく、エラーが発生しにくい [Uint64.Load] の使用を検討してください 144 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 145 func LoadUint64(addr *uint64) (val uint64) 146 147 // LoadUintptrはアトミックに*addrをロードします。 148 // より使いやすく、エラーが発生しにくい [Uintptr.Load] の使用を検討してください。 149 func LoadUintptr(addr *uintptr) (val uintptr) 150 151 // LoadPointerはアトミックに*addrをロードします。 152 // より使いやすく、エラーが発生しにくい [Pointer.Load] の使用を検討してください。 153 func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer) 154 155 // StoreInt32はアトミックにvalを*addrに格納します。 156 // より使いやすく、エラーが発生しにくい [Int32.Store] の使用を検討してください。 157 func StoreInt32(addr *int32, val int32) 158 159 // StoreInt64はアトミックにvalを*addrに格納します。 160 // より使いやすく、エラーが発生しにくい [Int64.Store] の使用を検討してください 161 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 162 func StoreInt64(addr *int64, val int64) 163 164 // StoreUint32はアトミックにvalを*addrに格納します。 165 // より使いやすく、エラーが発生しにくい [Uint32.Store] の使用を検討してください。 166 func StoreUint32(addr *uint32, val uint32) 167 168 // StoreUint64はアトミックにvalを*addrに格納します。 169 // より使いやすく、エラーが発生しにくい [Uint64.Store] の使用を検討してください 170 // (特に32ビットプラットフォームを対象とする場合は、バグセクションを参照してください)。 171 func StoreUint64(addr *uint64, val uint64) 172 173 // StoreUintptrはアトミックにvalを*addrに格納します。 174 // より使いやすく、エラーが発生しにくい [Uintptr.Store] の使用を検討してください。 175 func StoreUintptr(addr *uintptr, val uintptr) 176 177 // StorePointerはアトミックにvalを*addrに格納します。 178 // より使いやすく、エラーが発生しにくい [Pointer.Store] の使用を検討してください。 179 func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)