ホームページ >バックエンド開発 >Golang >Golang 関数型並行プログラミングにおけるデータ構造のスレッド セーフ

Golang 関数型並行プログラミングにおけるデータ構造のスレッド セーフ

王林
王林オリジナル
2024-04-17 18:51:021233ブラウズ

GoLang では、データ構造のスレッドの安全性を確保することが重要です。次のメソッドを使用できます。 ミューテックス ロック: 同時に 1 つのゴルーチンだけが共有データにアクセスできるようにします。読み取り/書き込みロック: 同時読み取りは許可されますが、同時に実行できる書き込みは 1 つだけです。チャネル: データの送受信がアトミックであることを保証する操作。アトミック操作: メモリ位置を直接操作する効率的な操作で、他のゴルーチンからの干渉が発生しません。

Golang 関数型並行プログラミングにおけるデータ構造のスレッド セーフ

GoLang 関数同時プログラミングにおけるデータ構造のスレッド セーフ

同時プログラミングでは、共有データ構造のスレッド セーフを確保する重要。 GoLang は、この目標を達成するためのいくつかの方法を提供します。

Mutex (ミューテックス)

ミューテックスは、最も一般的な同期プリミティブの 1 つであり、同時に 1 つのゴルーチン (同時タスク) だけが動作できるようにするために使用されます。共有データ。

var lock = sync.Mutex{}

func incrementCounter() {
    lock.Lock()
    defer lock.Unlock()
    count++
}

読み取り/書き込みロック (RWMutex)

読み取り/書き込みロックでは同時読み取りが可能ですが、同時に実行できる書き込みは 1 つだけです。これは通常、頻繁に読み取る必要があるが時々書き込む必要があるデータ構造に使用されます。

var rwlock = sync.RWMutex{}

func readCounter() {
    rwlock.RLock()
    defer rwlock.RUnlock()
    return count
}

func incrementCounter() {
    rwlock.Lock()
    defer rwlock.Unlock()
    count++
}

チャネル

チャネルは、スレッド セーフを実現するために GoLang で使用されるもう 1 つのツールです。チャネルは、データの送信と受信がアトミックな操作であることを保証します。

var counterChan = make(chan int)

func incrementCounter() {
    counterChan <- 1
}

func readCounter() int {
    return <-counterChan
}

アトミック操作

アトミック操作は、メモリ位置を直接操作する効率的な操作です。これらは、実行中に他のゴルーチンからの干渉がないことを保証します。

var count int32

func incrementCounter() {
    atomic.AddInt32(&count, 1)
}

func readCounter() int32 {
    return atomic.LoadInt32(&count)
}

実際的なケース

複数のゴルーチンが共有カウンターに同時にアクセスするシナリオを考えてみましょう。カウンタがスレッドセーフであることを保証するために、ミューテックスを使用してカウンタへのアクセスを保護できます。

var counter int
var lock sync.Mutex

func incrementCounter() {
    lock.Lock()
    defer lock.Unlock()
    counter++
}

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

この例では、ミューテックスにより、常に 1 つの goroutine だけが incrementCounter 関数を実行することが保証され、カウンターのスレッド安全性が確保されます。

以上がGolang 関数型並行プログラミングにおけるデータ構造のスレッド セーフの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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