Go 言語では、コルーチンを使用して同時操作を実装することが非常に一般的な方法になっています。ただし、変数が複数のコルーチン間で共有される場合、データ競合の問題が発生しやすくなります。データ競合は、2 つ以上のスレッドが同じメモリ位置を同時に読み書きしようとしたときに発生する同時プログラミングのバグです。この場合、プログラムは予測不可能で誤った結果を生成する可能性があります。
Go 言語では、この状況を回避するために、ミューテックス ロックなどのメカニズムを使用して解決できます。
ミューテックス ロックは、共有リソースに同期的にアクセスするために Go 言語で使用されるロックです。コルーチンが共有リソースにアクセスする必要がある場合、最初にミューテックスを取得してから操作を実行する必要があります。操作が完了した後、他のコルーチンが共有リソースにアクセスし続けることができるように、ミューテックス ロックを解放する必要があります。
ミューテックス ロックは次のように使用されます。
import "sync" var mu sync.Mutex // 互斥锁 func main() { // ... mu.Lock() // 获取互斥锁 // 访问共享资源 mu.Unlock() // 释放互斥锁 // ... }
上記のコードでは、Lock()
メソッドを使用してミューテックス ロック、Unlock( )
ミューテックスロックを解除するためにメソッドが使用されます。コルーチンがミューテックス ロックを取得すると、他のコルーチンはミューテックス ロックを取得する前に、コルーチンがミューテックス ロックを解放するまで待つ必要があります。これにより、データ競合の問題が回避されます。
次の例は、ミューテックス ロックを使用してデータ競合の問題を解決する方法を示しています。
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup count := 0 mu := sync.Mutex{} for i := 0; i < 100; i++ { wg.Add(1) go func() { mu.Lock() count++ mu.Unlock() wg.Done() }() } wg.Wait() fmt.Println("count: ", count) }
上記のコードでは、まず WaitGroup
オブジェクトを定義してコルーチンの数を記録します。次に、ミューテックス ロック mu
とカウンタ count
を定義します。次に、100 個のコルーチンが開始され、各コルーチンによってカウンターが 1 ずつ増加します。カウンタ count
は共有リソースであるため、操作前にミューテックス ロックを取得し、操作完了後にミューテックス ロックを解放する必要があります。最後に、Wait()
メソッドを使用して、すべてのコルーチンが終了するのを待ち、カウンター値を出力します。
操作結果は次のとおりです:
count: 100
結果から判断すると、操作は成功しました。この時点で、変数値は異なるスレッドで同期されます。
Go 言語での同時操作にコルーチンを使用する場合、複数のコルーチンが同じ共有リソースにアクセスする可能性があるため、データ競合の問題に注意する必要があります。ミューテックス ロックは、データ競合を解決するために使用されるロックの一種で、複数のコルーチンが同じ共有リソースに同時にアクセスする問題を効果的に回避できます。ミューテックス ロックを使用すると、異なるスレッド間で変数値が同期されることが保証されます。
以上がGo プログラムの変数値が異なるスレッド間で同期しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。