同期プリミティブを使用して Goroutine の同時実行を防ぐにはどうすればよいですか?

WBOY
リリース: 2024-06-06 11:36:59
オリジナル
706 人が閲覧しました

同時実行の問題を防ぐために、次のような同期プリミティブを使用できます。 Mutex: 一度に 1 つの Goroutine のみが共有データにアクセスできます。セマフォ: 共有データに同時にアクセスできるゴルーチンの数を制限します。 WaitGroup: Goroutine のグループが実行を完了するまで待ちます。条件変数: Goroutine が特定の条件が満たされるまで待機できるようにします。実際のケース: Mutex を使用して、Goroutine の共有リソースへのアクセスを調整することで同時実行を防ぎ、データ競合の問題を防ぎます。

如何使用同步原语来防止 Goroutine 并发?

同期プリミティブを使用してゴルーチンの同時実行を防ぐ方法

Go 言語では、ゴルーチンは同じメモリ空間を共有する同時関数です。これにより、複数のゴルーチンが共有変数に同時にアクセスするときに発生するデータ競合などの同時実行性の問題が発生する可能性があります。

同時実行性の問題を防ぐために、共有変数へのアクセスを調整するために使用される技術である同期プリミティブを使用できます。

共通の同期プリミティブ

Go 言語は、以下を含むいくつかの同期プリミティブを提供します。

  • Mutex (ミューテックス) : 一度に 1 つの Goroutine のみが共有データにアクセスできます。
  • セマフォ: 共有データに同時にアクセスできるゴルーチンの数を制限します。
  • WaitGroup (待機グループ): Goroutine のグループが実行を完了するのを待つために使用されます。
  • 条件変数: ゴルーチンが特定の条件が満たされるまで待機できるようにします。

実際のケース: Mutex を使用して同時実行を防止する

実際のケースを使用して、同時実行を防止するために Mutex を使用する方法を説明しましょう。 count フィールドを含む Counter 構造があるシナリオを考えてみましょう。同時ゴルーチンを使用して、このカウンターを同時に更新したいと考えています。 Counter 结构,其中包含一个 count 字段。我们希望使用并发 Goroutine 并发更新该计数器。

package main

import (
    "fmt"
    "sync"
)

// Counter represents a simple counter.
type Counter struct {
    mu     sync.Mutex
    count  int
}

// Increment increments the count by 1.
func (c *Counter) Increment() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.count++
}

// GetCount returns the current value of the count.
func (c *Counter) GetCount() int {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.count
}

func main() {
    // Create a new counter.
    c := &Counter{}

    // Create a group of Goroutines to increment the counter concurrently.
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            c.Increment()
        }()
    }

    // Wait for all Goroutines to finish.
    wg.Wait()

    // Print the final count.
    fmt.Println("Final count:", c.GetCount())
}
ログイン後にコピー

在这个案例中,Mutex 用于保护对 count 字段的访问。当一个 Goroutine 尝试更新计数器时,它会先获取 Mutexrrreee

この場合、Mutex は、count フィールドへのアクセスを保護するために使用されます。 Goroutine がカウンターを更新しようとすると、まず Mutex ロックを取得します。これにより、他の Goroutine が同時にカウンターを更新することがなくなり、データ競合が防止されます。

このプログラムを実行すると、すべての Goroutine の増分の合計である最終カウントが出力されます。これは、Mutex が同時実行性の問題を正常に防止したことを示しています。 🎜

以上が同期プリミティブを使用して Goroutine の同時実行を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!