Golang におけるロックの原理と応用分析
2.1 ミューテックス ロック
ミューテックス ロックの基本原理は、フラグ ビットを使用してリソースがロックされているかどうかを示すことです。 goroutine がミューテックスによって保護されているリソースにアクセスしたい場合、まずロックを取得しようとします。別のゴルーチンによってロックが取得されている場合、現在のゴルーチンはロックが解放されるまでブロックされます。 goroutine がロックを取得すると、リソースを操作し、操作の完了後にロックを解放して、他の goroutine がロックを取得できるようにします。
次に、ミューテックス ロックの適用例を示します。
package main import ( "fmt" "sync" ) var count int var lock sync.Mutex func increase() { for i := 0; i < 100000; i++ { lock.Lock() count++ lock.Unlock() } } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { increase() wg.Done() }() } wg.Wait() fmt.Println("count:", count) }
上の例では、グローバル変数 count を保護するために、ミューテックス ロック
lock を作成しました。
読み取りおよび書き込み操作。次に、count
変数を同時に操作するために 10 個のゴルーチンが開始され、各ゴルーチンは count
に対して 100,000 回の加算演算を実行します。最後に、count
の値を出力すると、結果が常に 1000000 であることがわかります。これは、ミューテックス ロックが実際に同時操作の正確さを保証していることを示しています。
2.2 読み取り/書き込みロック
読み取り/書き込みロックは、ミューテックス ロックの拡張です。これにより、複数の goroutine が共有リソースを同時に読み取ることができ、書き込み時に 1 つの goroutine のみが存在できるようになります。リソース。読み取り/書き込みロックにより、読み取り操作の同時処理の効率が向上します。
次に、読み取り/書き込みロックの適用例を示します:
package main import ( "fmt" "sync" "time" ) var count int var rwlock sync.RWMutex func read() { rwlock.RLock() defer rwlock.RUnlock() fmt.Println("read:", count) } func write() { rwlock.Lock() defer rwlock.Unlock() count = count + 1 fmt.Println("write:", count) } func main() { go read() go write() time.Sleep(time.Second) }
上の例では、グローバル変数を保護するために読み取り/書き込みロック rwlock
を作成しました。 count
読み取りおよび書き込み操作。 2 つのゴルーチンが開始され、1 つは読み取り用で、もう 1 つは書き込み用です。読み取り操作は同時に実行できるため、読み取り操作が最初に実行され、出力 read:
と write:
の順序は異なる場合があります。ただし、最初に書き込み操作が実行され、次に読み取り操作が実行されてデータの正確性が保証されることを確認できます。
以上がGolang におけるロックの原理と応用の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。