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)