ホームページ  >  記事  >  バックエンド開発  >  golang の読み書きロックの実装

golang の読み書きロックの実装

WBOY
WBOYオリジナル
2023-05-10 13:11:40590ブラウズ

Golang は、高い同時実行性と高性能のアプリケーション開発をサポートする、非常に人気のある最新のプログラミング言語です。 Golang では、読み取り/書き込みロックは、複数のコルーチンが同時に共有変数を読み取ることを許可する一般的な同期メカニズムですが、共有変数に書き込むことができるのは 1 つのコルーチンのみです。この記事では、Golangを使用して読み書きロックを実装する方法を紹介します。

読み取り/書き込みロックの基本原理

読み取り/書き込みロックは、複数のコルーチンが同時に共有変数を読み取ることを許可する同期メカニズムですが、共有変数に書き込むことができるのは 1 つのコルーチンのみです。読み取り/書き込みロックにより、複数のコルーチンが同時に共有変数を読み取ることができるため、競合とロック競合の数が減少するため、同時実行パフォーマンスを効果的に向上させることができます。

読み取り/書き込みロックには、読み取りと書き込みの 2 つの状態があります。読み取り状態では、複数のコルーチンが同時にシェア変数を読み取ることができますが、書き込み状態では、1 つのコルーチンのみがシェア変数の書き込みを許可されます。読み取り/書き込みロックの状態遷移には、次の状況が含まれます:

1. 読み取りロック: 複数のコルーチンは同時に読み取りロックを取得できますが、書き込みロックは取得できません。

2. 書き込みロック: 書き込みロックを取得できるのは 1 つのコルーチンのみであり、他のコルーチンは読み取りロックおよび書き込みロックを取得できません。

3. ロック解除: すべてのコルーチンは読み取りロックと書き込みロックを解放できます。

ここで、Golang を使用して読み取り/書き込みロックを実装する方法を見てみましょう。

コードの実装

Golang 標準ライブラリには読み取り/書き込みロックの実装が提供されており、同期パッケージの RWMutex 構造体を直接使用して読み取り/書き込みロックを実装できます。

最初に、RWMutex 構造体の定義を見てみましょう。

type RWMutex struct {

 //包含隐藏或非导出字段

}

RWMutex には、非表示または非表示のオブジェクトが含まれています。 -exported フィールド 。次の 3 つのメソッドが提供されます。

1.RLock: 読み取りロックを取得します。

func (rw *RWMutex) RLock()

2.RUnlock: 読み取りロックを解放します。

func (rw *RWMutex) RUnlock()

3.Lock: 書き込みロックの取得

func (rw *RWMutex) Lock()

4 .Unlock: 書き込みロックを解放します。

func (rw *RWMutex) Unlock()

以下では、簡単な例を使用して、RWMutex を使用して読み取りおよび書き込みロックを実装する方法を示します。

package main

import (

"fmt"
"sync"

)

var (

count int
rw sync.RWMutex

)

func main() {

for i := 0; i < 10; i++ {
    go read(i)
}
for i := 0; i < 5; i++ {
    go write(i)
}
fmt.Scanln()

}

func read(n int) {

rw.RLock()
fmt.Println("读取协程", n, "开始读取数据")
v := count
fmt.Println("读取协程", n, "读取数据为:", v)
rw.RUnlock()

}

func write(n int) {

rw.Lock()
fmt.Println("写入协程", n, "开始写入数据")
count++
v := count
fmt.Println("写入协程", n, "写入数据为:", v)
rw.Unlock()

}

コードでは、共有変数 count と RWMutex オブジェクト rw を定義します。 10 個の読み取りコルーチンと 5 個の書き込みコルーチンを作成し、これらのコルーチン内の共有変数の読み取りと書き込みを行いました。

読み取り関数では、RLock メソッドを使用して読み取りロックを取得し、共有変数を読み取り、読み取り完了後に RUnlock メソッドを使用して読み取りロックを解放します。 write関数では、Lockメソッドを使用して書き込みロックを取得し、シェア変数に書き込み、書き込み完了後にUnlockメソッドを使用して書き込みロックを解放します。

コードを実行すると、複数のコルーチンが同時にシェア変数の読み取りと書き込みを行っていることがわかりますが、シェア変数に書き込むことができるのは 1 つのコルーチンだけです。

概要

この記事では、Golang を使用して読み取り/書き込みロックを実装する方法を紹介しました。同期パッケージの RWMutex 構造体を使用して読み取り/書き込みロックを実装し、RLock、RUNlock、Lock、Unlock メソッドを通じて同時アクセス共有変数の読み取りと書き込みを制御します。読み取り/書き込みロックの実装により、複数のコルーチンが共有変数を同時に読み取ることができるため、パフォーマンスが向上し、競合とロック競合の数が減少します。

以上がgolang の読み書きロックの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。