問題:
Go では、データを安全に読み取る方法並列コンピューティングでは別々のスレッドから?具体的には、データの整合性を損なうことなくワーカー スレッドからデータを収集するにはどうすればよいでしょうか?
シナリオ:
メイン スレッドは、非同期で実行される複数のワーカー インスタンスを作成します。メインスレッドは 10 秒ごとにワーカーから値 (反復回数など) を収集し、統合レポートを表示する必要があります。
質問:
安全ですか?ワーカーから値を直接読み取りますか?さらに、この要件を効率的に実装するための代替アプローチはありますか?
回答:
ワーカーから値を直接読み取ることは、Go の同時実行モデルに違反するため安全ではありません。 Go では、同時書き込み操作によるデータ破損を防ぐために、ゴルーチン間で共有されるデータを同期メカニズムで保護する必要があります。
これに対処する 1 つのアプローチは、sync.RWMutex データ構造を使用することです。
sync.RWMutex を使用した実装例:
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() }
あるいは、sync/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 サイトの他の関連記事を参照してください。