ソースコードの学習に行く-sync.atomicライブラリ

このパッケージの主な機能は、goで記述されているのではなく、下部に実装する必要があります。最初にドキュメントを確認してください。

アトミックパッケージは、同期アルゴリズムを実装するための実用的な低レベルのアトミックメモリプリミティブを提供します。

これらの機能を正しく使用するには、細心の注意が必要です。低レベルのアプリケーションの特別な場合を除いて、同期は、同期パッケージ内のチャネルまたは他のツールを使用して最もよく達成されます。通信を介してメモリを共有します。共有メモリを介して通信しないでください。

SwapT関数によって実装されるスワップ操作は、原子的には次のものと同等です。

old = *addr
*addr = new
return old

つまり、メモリアドレスの値を新しい値に更新し、古い値を返します

CompareAndSwapT関数によって実装される比較スワップ操作は、原子的には次のものと同等です。

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

つまり、メモリアドレスの値が古い値と比較され、等しい場合は新しい値に更新されてtrueが返されます。これは、アトミック更新が成功したことを意味します。それ以外の場合は、falseを返します。アトミックアップデートが失敗しました。

AddT関数によって実装される加算演算は、原子的には次のものと同等です。

*addr += dalte
return *addr

LoadTおよびStoreTによって実装されるロードおよびストア操作は、アトミックにreturn *addrおよびと同等*addr = valです。

以下は、アトミックパッケージによって提供される関数です。

  1. スワップ
  2. CompareAndSwap
  3. 追加
  4. 負荷
  5. ストア
    は追加をサポートしていません。さらに、すべての操作は次のデータ型をサポートしています。
  • int32
  • int64
  • uint32
  • uint64
  • uintptr
  • unsafe.Pointer

xから符号付きの負の定数値cを減算する場合は、を使用しますAddUint32(&x, ^uint32(c-1))


value.goをもう一度見てください

Value構造体は、固定タイプの値のアトミックなロードとストレージを提供します。Valueのゼロ値をロードしてnilを取得します。ストアド関数が呼び出されると、値をコピーすることはできません。

type Value struct {
    
    
	v interface{
    
    }
}

呼び出しLoadPointerStorePointer、価値のある負荷とストア達成することによって

おすすめ

転載: blog.csdn.net/qq_35753140/article/details/104816141