Golang における変数代入操作はアトミックですか?特定のコード例が必要です。
Go 言語では、変数代入操作の原子性が一般的な問題です。アトミック性とは、実行中に操作が中断されない特性を指し、複数のスレッドが同時に同じ変数にアクセスしたり変更したりしても、中間状態が存在しません。これは、同時実行プログラムの正確性にとって非常に重要です。
Go 言語標準ライブラリは、アトミック操作を実行するための sync/atomic
パッケージを提供します。このパッケージのアトミック操作により、変数の読み取りと変更がアトミックであることが保証されます。ただし、代入操作自体は Go 言語のアトミック操作ではないことに注意してください。
変数代入操作のアトミック性の問題をより深く理解するために、特定のコード例を通して説明します。
サンプル コードは次のとおりです。
package main import ( "fmt" "sync" "sync/atomic" ) func main() { var count int32 // 使用sync.WaitGroup等待goroutine执行完毕 var wg sync.WaitGroup wg.Add(2) // 第一个goroutine执行count++,循环10万次 go func() { defer wg.Done() for i := 0; i < 100000; i++ { count++ } }() // 第二个goroutine执行count--,循环10万次 go func() { defer wg.Done() for i := 0; i < 100000; i++ { count-- } }() // 等待goroutine执行完毕 wg.Wait() // 输出最终的count值 fmt.Println(count) }
上記のサンプル コードでは、int32 型変数 count
を作成し、count に 2 つのゴルーチンを定義しました。
加算と減算の演算を実行します。各ゴルーチンは 100,000 回ループします。
count
および count--
操作はアトミックではないため、複数のゴルーチンが同時に count
を変更するとデータが表示される可能性があります。問題。変数代入操作がアトミックである場合、最終的な count
値は 0 である必要があります。
変数代入操作のアトミック性を確保するために、代わりに sync/atomic
パッケージの AddInt32
関数と SubInt32
関数を使用できます。 count
および count--
操作のコード変更は次のとおりです。
package main import ( "fmt" "sync" "sync/atomic" ) func main() { var count int32 // 使用sync.WaitGroup等待goroutine执行完毕 var wg sync.WaitGroup wg.Add(2) // 第一个goroutine执行count++,循环10万次 go func() { defer wg.Done() for i := 0; i < 100000; i++ { atomic.AddInt32(&count, 1) } }() // 第二个goroutine执行count--,循环10万次 go func() { defer wg.Done() for i := 0; i < 100000; i++ { atomic.AddInt32(&count, -1) } }() // 等待goroutine执行完毕 wg.Wait() // 输出最终的count值 fmt.Println(count) }
上記の変更により、atomic.AddInt32
を使用します。変数代入操作のアトミック性を保証する関数。コードを変更すると、count
の最終出力値は 0 になり、変数代入操作がアトミックであることがわかります。
要約すると、Go 言語では変数代入操作はアトミックではありませんが、sync/atomic
パッケージのアトミック操作を使用して変数代入のアトミック性を確保できます。
以上がGolang では変数の代入はアトミックですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。