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 サイトの他の関連記事を参照してください。