ホームページ >バックエンド開発 >Golang >Go で複数のゴルーチンから値を安全に読み取るにはどうすればよいですか?

Go で複数のゴルーチンから値を安全に読み取るにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-25 05:03:21967ブラウズ

How Can I Safely Read Values from Multiple Goroutines in Go?

Go の異なるスレッドから値を安全に読み取る

Go では、適切な同期を行わずに複数の goroutine から値に同時にアクセスするのは危険です。データの整合性を確保するには、同期メカニズムを採用することが重要です。

ミューテックスと読み取り/書き込みロックによる同期

特定のシナリオでは、メインスレッドがデータを収集する必要があります。ワーカー スレッドからの値を 10 秒ごとに取得するには、チャネルだけでは十分ではありません。代わりに、読み取り/書き込みミューテックスを使用できます。

ワーカーは値を更新するときに書き込みロックを取得し、メインスレッドは値を取得するときに読み取りロックを取得します。これにより、競合状態が防止され、データの一貫性が保証されます。

ミューテックスを使用した実装例

次のコードは、ミューテックスを使用した単純な実装を示しています。

type Worker struct {
    iterMu sync.RWMutex
    iter   int
}

func (w *Worker) Iter() int {
    w.iterMu.RLock()
    defer w.iterMu.RUnlock()
    return w.iter
}

func (w *Worker) setIter(n int) {
    w.iterMu.Lock()
    w.iter = n
    w.iterMu.Unlock()
}

代替案: Atomic を使用するカウンタ

あるいは、sync/atomic パッケージはスレッドセーフなアトミック カウンタを提供し、ミューテックスのオーバーヘッドなしで直接読み取りおよび書き込み操作を可能にします。

type Worker struct {
    iter int64
}

func (w *Worker) Iter() int64 {
    return atomic.LoadInt64(&w.iter)
}

func (w *Worker) setIter(n int64) {
    atomic.StoreInt64(&w.iter, n)
}

以上がGo で複数のゴルーチンから値を安全に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。