ミューテックスとチャネル: いつどちらを選択すべきですか?

Susan Sarandon
リリース: 2024-11-09 06:19:02
オリジナル
692 人が閲覧しました

Mutex vs. Channel: When Should You Choose Which?

ミューテックスとチャネルを選択する場合

Golang は同時プログラミング用に sync.Mutex とチャネルの両方を提供し、開発者に決定を提示しますさまざまなシナリオでどのツールを使用するか。

Mutex とChannel

  • Mutex: 一度に 1 つの goroutine だけが共有リソースにアクセスできるようにするロックで、競合状態を防ぎます。
  • Channel : ゴルーチンの送受信を可能にする通信メカニズムdata.

ミューテックスの使用

ミューテックスは次のような状況に最適です。

  • 内部状態の保護: データ構造の内部状態を同時実行から保護する
  • キャッシュの問題: キャッシュされたデータへのスレッドセーフなアクセスを必要とする単純なキャッシュの実装。
  • パフォーマンスの向上: チャネル通信時オーバーヘッドが大きいため、ミューテックスを使用すると改善できるパフォーマンス。

1.シンプル カウンター:
ミューテックスを使用して、一度に 1 つのゴルーチンのみがカウンターをインクリメントするシンプルなカウンターを実装できます。

import "sync"

var counter int
var m sync.Mutex

func incrementCounter() {
    m.Lock()
    counter++
    m.Unlock()
}
ログイン後にコピー

2.ピンポン ゲーム:
チャネルはピンポン ゲームによく使用されますが、ミューテックスは共有ボール オブジェクトへのアクセスを保護することで同じ機能を実現できます。

import "sync"

type Ball struct {
    hits int
}

var ball Ball
var m sync.Mutex

func player1() {
    for {
        m.Lock()
        ball.hits++
        fmt.Println("Player 1:", ball.hits)
        m.Unlock()
    }
}
ログイン後にコピー

3.シンプル キャッシュ:
ミューテックスを使用すると、内容へのスレッドセーフなアクセスを備えたシンプル キャッシュを実装できます。

import "sync"

type Cache struct {
    m map[string]interface{}
    mu sync.Mutex
}

func (c *Cache) Get(key string) interface{} {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.m[key]
}
ログイン後にコピー

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

ミューテックスとチャネルのどちらを選択するかは、タスクの特定の要件によって異なります。ミューテックスは、競合状態を防止し、共有データへのスレッドセーフなアクセスを確保することが最重要であるシナリオに適しています。一方、チャネルはゴルーチン間の通信とデータ共有に優れています。

以上がミューテックスとチャネル: いつどちらを選択すべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート