ホームページ  >  記事  >  バックエンド開発  >  Go におけるミューテックスとチャネル: それぞれをいつ使用するか?

Go におけるミューテックスとチャネル: それぞれをいつ使用するか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-09 05:53:02584ブラウズ

Mutexes vs. Channels in Go: When to Use Each?

ミューテックスとチャネルの選択: それぞれを使用する場合

はじめに

Go で共有リソースへの同時アクセスを同期する場合、sync.Mutex とチャネル (chan) という 2 つの主なオプションが利用可能です。どちらも同期を達成できますが、その適合性は特定のシナリオによって異なります。

ミューテックスとチャネル

ミューテックス (sync.Mutex):

  • リソースをロックし、一度に 1 つの goroutine のみがアクセスできるようにします。
  • 排他的所有権を提供し、ロックされたリソースが一貫した状態に保たれることを保証します。

チャネル (chan):

  • メッセージまたはデータを渡すことでゴルーチン間の通信を容易にします。
  • 複数のゴルーチンからの同時アクセスをサポートし、データ交換と

ミューテックスを使用する場合

  • 内部状態の保護: ミューテックスは、内部の共有変数を保護するのに適しています。内部構造やキャッシュなどの単一のゴルーチン。
  • キャッシュの問題: ミューテックスはキャッシュされたデータへのアクセスを同期して、データの一貫性を確保し、競合状態を防ぐことができます。
  • パフォーマンスを向上するには: リソースの排他的所有権が不可欠な特定のシナリオでは、ミューテックスはチャネルよりも効率的です。

例:

  • 同期したインクリメントおよびデクリメント操作にミューテックスを使用したシンプルなカウンター。
var count int
var m sync.Mutex

func increment() {
    m.Lock()
    defer m.Unlock()
    count++
}
  • ミューテックスを使用して 2 つのゴルーチン間で共有ボールを渡す「ピンポン」ゲーム。
var ball *Ball
var m sync.Mutex

func player(name string) {
    for {
        m.Lock()
        ball.hits++
        fmt.Println(name, ball.hits)
        time.Sleep(100 * time.Millisecond)
        m.Unlock()
    }
}
  • マップへのアクセスを同期するためにミューテックスを使用する単純なキャッシュ。
var cache map[string]interface{}
var m sync.Mutex

func get(key string) interface{} {
    m.Lock()
    defer m.Unlock()
    return cache[key]
}

以上がGo におけるミューテックスとチャネル: それぞれをいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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