複数の goroutine (軽量スレッド) が同じ共有を変更しようとする場合データを同時に実行すると、競合状態やデータ破損が発生する可能性があります。ロックにより、一度に 1 つの goroutine だけがデータにアクセスできるようになり、データの整合性が確保されます。
sync.RWMutex は、読み取りと書き込みを提供するミューテックスの一種です。書き込みロック。複数の goroutine が同時に共有データを読み取ることができるようにしながら、一度に 1 つの goroutine への書き込みアクセスを制限します。 time.
提供されたコードでは、countersLock という名前の RWMutex が Stat 構造体のcounters フィールドを保護するために使用されます。これは、複数のゴルーチンがカウンター フィールドから安全に読み取ることができますが、それを変更できるのは一度に 1 つのゴルーチンだけであることを意味します。
RLock() メソッドと RUnlock() メソッド構造体内の特定のフィールドを選択的にロックできるようにします。この場合、s.countersLock.RLock() はカウンター フィールドのみをロックし、複数のゴルーチンが同時にそこから読み取れるようにします。
averagesLock フィールドは Stat 構造体の Averages フィールドを保護しており、同様に使用する必要があります。
チャネルは通常、ゴルーチン間の通信と同期に使用されますが、共有データの保護にはそれほど効率的ではありません。 RWutex は同時アクセス制御用に特別に設計されており、この目的のために優れたパフォーマンスと開発者の人間工学を提供します。
atomic.AddInt64 は、sync/atomic パッケージ内の関数であり、 int64 変数の値。アトミック操作では、変数が単一の分割不可能な操作として読み取られ、更新されるため、同時実行性の問題が防止されます。
カウンターをインクリメントする前にミューテックスのロックを解除すると、ゴルーチンがロックを保持するのを防ぎます。長期間にわたって、他のゴルーチンが可能な場合に読み取りのためにカウンターフィールドにアクセスできるようにします。
以上が同時データアクセスにチャネルの代わりに Go の RWMutex を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。