同時実行の問題を防ぐために、次のような同期プリミティブを使用できます。 Mutex: 一度に 1 つの Goroutine のみが共有データにアクセスできます。セマフォ: 共有データに同時にアクセスできるゴルーチンの数を制限します。 WaitGroup: Goroutine のグループが実行を完了するまで待ちます。条件変数: Goroutine が特定の条件が満たされるまで待機できるようにします。実際のケース: Mutex を使用して、Goroutine の共有リソースへのアクセスを調整することで同時実行を防ぎ、データ競合の問題を防ぎます。
同期プリミティブを使用してゴルーチンの同時実行を防ぐ方法
Go 言語では、ゴルーチンは同じメモリ空間を共有する同時関数です。これにより、複数のゴルーチンが共有変数に同時にアクセスするときに発生するデータ競合などの同時実行性の問題が発生する可能性があります。
同時実行性の問題を防ぐために、共有変数へのアクセスを調整するために使用される技術である同期プリミティブを使用できます。
共通の同期プリミティブ
Go 言語は、以下を含むいくつかの同期プリミティブを提供します。
実際のケース: 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 尝试更新计数器时,它会先获取 Mutex
rrreee
Mutex
は、count
フィールドへのアクセスを保護するために使用されます。 Goroutine がカウンターを更新しようとすると、まず Mutex
ロックを取得します。これにより、他の Goroutine が同時にカウンターを更新することがなくなり、データ競合が防止されます。 このプログラムを実行すると、すべての Goroutine の増分の合計である最終カウントが出力されます。これは、Mutex が同時実行性の問題を正常に防止したことを示しています。 🎜以上が同期プリミティブを使用して Goroutine の同時実行を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。