ホームページ >バックエンド開発 >Golang >Golang 関数同時プログラミングにおけるロックの種類と使用法

Golang 関数同時プログラミングにおけるロックの種類と使用法

WBOY
WBOYオリジナル
2024-04-18 08:12:02486ブラウズ

Go は、関数型並行プログラミングで、ミューテックス ロック (Mutex)、読み取り/書き込みロック (RWMutex)、およびワンタイム ロック (Once) という 3 つのロック タイプを提供します。ミューテックス ロックは排他的アクセスを保証し、読み取り/書き込みロックは同時読み取りと単一書き込みを許可し、ワンタイム ロックはコード ブロックが 1 回だけ実行されることを保証します。これらのロックは、共有リソースへのアクセスを調整し、データ競合を防ぐために使用されます。実際には、ミューテックスは同時 Web サービス内のデータの一貫性を保証し、同時リクエストが共有データ構造を同時に変更することを防ぎます。

Golang 関数同時プログラミングにおけるロックの種類と使用法

Go 関数型並行プログラミングにおけるロックの種類と使用法

Go 関数型並行プログラミングでは、ロックはデータの共有を防ぐためのリソース アクセスを調整するために使用される同期メカニズムです。レース。 Go は複数の種類のロックを提供しており、それぞれに異なる特性と適用可能なシナリオがあります。

Mutex ロック

Mutex ロック (Mutex) は、同時に 1 つの goroutine のみがリソースを取得できる基本的なロックです。共有リソースへの排他的アクセスが保証されます。

import (
    "sync"
    "fmt"
)

var (
    mu      sync.Mutex
    counter int
)

func main() {
    for i := 0; i < 1000; i++ {
        go func() {
            mu.Lock()
            counter++
            mu.Unlock()
        }()
    }
    fmt.Println("Final counter value:", counter)
}

読み取り/書き込みロック

読み取り/書き込みロック (RWMutex) を使用すると、複数の goroutine が共有リソースを同時に読み取ることができますが、同時にリソースに書き込むことができる goroutine は 1 つだけです。

import (
    "sync"
    "fmt"
)

var (
    rwmu  sync.RWMutex
    shared []int
)

func main() {
    // 多个 goroutine 并发读取共享切片
    for i := 0; i < 1000; i++ {
        go func() {
            rwmu.RLock()
            fmt.Println("Read:", shared)
            rwmu.RUnlock()
        }()
    }

    // 单独的 goroutine 写入共享切片
    go func() {
        rwmu.Lock()
        shared = append(shared, 1, 2, 3)
        rwmu.Unlock()
    }()
}

Once

Once は、コードの特定のブロックが 1 回だけ実行されるようにするために使用される 1 回限りのロックです。

import (
    "sync"
    "fmt"
)

var (
    initOnce sync.Once
    inited   = false
)

func initialize() {
    inited = true
    fmt.Println("Initialized")
}

func main() {
    initOnce.Do(initialize)
    if inited {
        fmt.Println("Already initialized")
    } else {
        fmt.Println("Not initialized")
    }
}

実際的なケース: 同時 Web サービスでのデータの一貫性の確保

複数の同時リクエストが同じ共有データ構造上で動作する必要がある Web サービスがあるとします。データの一貫性を確保するために、ミューテックス ロックを使用してデータ構造を保護し、同時リクエストによってデータ構造が同時に変更されるのを防ぐことができます。

import (
    "sync"
    "net/http"
)

var (
    mu      sync.Mutex
    clients map[string]*http.Client
)

func main() {
    http.HandleFunc("/addClient", func(w http.ResponseWriter, r *http.Request) {
        mu.Lock()
        clients[r.FormValue("name")] = &http.Client{}
        mu.Unlock()
    })
}

この例では、ミューテックス ロック mu を使用して clients マップへの同時アクセスを保護し、1 つのリクエストだけで顧客情報を追加または変更できるようにします。同時に実行できるため、データ競合が回避されます。

以上がGolang 関数同時プログラミングにおけるロックの種類と使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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