値を変更する前にミューテックスのロックを解除する
次のコード スニペットでは、リソースを保護するためにミューテックスが使用されています。ただし、値を変更する前にミューテックスのロックが解除されます。
type Stat struct {
counters map[string]*int64
countersLock sync.RWMutex
averages map[string]*int64
averagesLock sync.RWMutex
}
func (s *Stat) Count(name string) {
s.countersLock.RLock()
counter := s.counters[name]
s.countersLock.RUnlock()
if counter != nil {
atomic.AddInt64(counter, int64(1))
return
}
}
ログイン後にコピー
説明:
-
質問 1 (ミューテックスを使用する理由?):
- 共有データにアクセスする場合同時に実行するゴルーチン間では、データ競合を回避することが重要です。
- 複数のゴルーチンが同じリソースに同時にアクセスするとデータ競合が発生し、誤った動作や予測不可能な動作が発生する可能性があります。
- ミューテックス (通常の Mutex と RWMutex の両方) は、ゴルーチンが共有データに順番にアクセスして変更できるようにするロック メカニズムとして機能し、データの共有を防ぎます。レース。
-
質問 2 (RWMutex は何をロックしますか?):
- sync.RWMutex の RLock メソッドレシーバー構造体全体 (タイプ Stat の例)。
- 複数のゴルーチンがデータを同時に読み取ることはできますが、ゴルーチンがデータに書き込むことはできません。
-
質問 3 (RWMutex を実行しますか)平均フィールドをロック?):
- columnsLock の RLock は、平均フィールドまたはそれに関連付けられたミューテックス (averagesLock) をロックしません。
- これにより、他のゴルーチンは、カウンター フィールドに影響を与えることなく、平均フィールドを同時に読み取り、変更できます。
-
質問 4 (なぜ使用するのか同時実行性のための RWMutex とチャネル?):
- チャネルは、ゴルーチン間の通信とデータ転送のためのより効率的なオプションであり、共有データの保護を目的としたものではありません。
- ミューテックス (例: RWMutex) 共有ファイル内の特定のデータ項目へのアクセスをきめ細かく制御できます。
-
質問 5 (atomic.AddInt64 を使用する理由):
- atomic.AddInt64 は同時実行性を提供します。カウンタ内の int64 の値をインクリメントする安全な方法pointer.
- これにより、加算操作がアトミックに実行されるようになり、データ競合が防止され、ゴルーチン間でカウンタが一貫して更新されることが保証されます。
-
質問 6 (なぜ追加する前にロックを解除するのか) counter?):
- countersLock.RUnlock() は、カウンター フィールドの読み取りロックを解放するために使用されます。
- これにより、他のゴルーチンがアクセスできるようになります。現在のゴルーチンがアトミックな追加を実行している間、カウンタ フィールドにアクセスします。
- これにより、カウンタ フィールドへのアクセスが保証されます。同時実行性を維持し、潜在的なデータ競合を回避しながら同期されます。
以上がGo 同時実行で値を変更する前にミューテックスのロックを解除するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。