github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/sync/atomic/example_test.go (about) 1 // Copyright 2018 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 package atomic_test 6 7 import ( 8 "github.com/shogo82148/std/sync" 9 "github.com/shogo82148/std/sync/atomic" 10 "github.com/shogo82148/std/time" 11 ) 12 13 // 次の例は、Valueを使用して定期的なプログラム設定の更新と 14 // 変更のワーカーゴルーチンへの伝播を行う方法を示しています。 15 func ExampleValue_config() { 16 var config atomic.Value // 現在のサーバー設定を保持します 17 // 初期設定値を作成し、configに格納します。 18 config.Store(loadConfig()) 19 go func() { 20 // 10秒ごとに設定を再読み込みし、 21 // 新しいバージョンで設定値を更新します。 22 for { 23 time.Sleep(10 * time.Second) 24 config.Store(loadConfig()) 25 } 26 }() 27 // 最新の設定値を使用して受信リクエストを処理する 28 // ワーカーゴルーチンを作成します。 29 for i := 0; i < 10; i++ { 30 go func() { 31 for r := range requests() { 32 c := config.Load() 33 // 設定cを使用してリクエストrを処理します。 34 _, _ = r, c 35 } 36 }() 37 } 38 } 39 40 // 次の例は、コピーオンライトのイディオムを使用して、 41 // 頻繁に読み取られるが、あまり更新されないデータ構造を維持する方法を示しています。 42 func ExampleValue_readMostly() { 43 type Map map[string]string 44 var m atomic.Value 45 m.Store(make(Map)) 46 var mu sync.Mutex // 書き込み者のみが使用します 47 // read関数は、さらなる同期化なしでデータを読み取るために使用できます 48 read := func(key string) (val string) { 49 m1 := m.Load().(Map) 50 return m1[key] 51 } 52 // insert関数は、さらなる同期化なしでデータを更新するために使用できます 53 insert := func(key, val string) { 54 mu.Lock() // 他の潜在的な書き込み者と同期します 55 defer mu.Unlock() 56 m1 := m.Load().(Map) // データ構造の現在の値をロードします 57 m2 := make(Map) // 新しい値を作成します 58 for k, v := range m1 { 59 m2[k] = v // 現在のオブジェクトから新しいオブジェクトにすべてのデータをコピーします 60 } 61 m2[key] = val // 必要な更新を行います 62 m.Store(m2) // 現在のオブジェクトを新しいオブジェクトとアトミックに置き換えます 63 // この時点で、すべての新しい読み取り者は新しいバージョンで作業を開始します。 64 // 既存の読み取り者(もしあれば)がそれを使用し終えると、古いバージョンはガベージコレクションされます。 65 } 66 _, _ = read, insert 67 }