Go 同時プログラミングでの同期乱数生成: ミューテックス (sync.Mutex) を使用して、rand.Rand 乱数ジェネレーターへのアクセスを制御します。各ゴルーチンは乱数を生成する前にミューテックスを取得し、生成後にミューテックスを解放します。これにより、一度に 1 つの goroutine だけが乱数ジェネレーターにアクセスできるようになり、データ競合が排除されます。
Go 同時プログラミングでは、複数のゴルーチンにわたって乱数を生成する必要がある場合があります。同期が考慮されていない場合、競合状態や予期しない動作が発生する可能性があります。
Go は、擬似乱数を生成するための math/rand
パッケージを提供します。デフォルトでは、同時実行安全ではない方法で動作します。これは、同じ rand.Rand
インスタンスに同時にアクセスすると、データ競合が発生し、結果が不定になることを意味します。 math/rand
包来生成伪随机数。默认情况下,它以非并发安全的方式操作。这意味着如果并发访问同一个 rand.Rand
实例,则会出现数据争用和不确定的结果。
为了在并行处理中同步随机数生成,可以使用互斥锁 (sync.Mutex
)。互斥锁允许一次只有一个 goroutine 访问临界区(在这种情况下,rand.Rand
实例)。
以下代码演示如何使用互斥锁同步随机数生成:
package main import ( "math/rand" "sync" ) var ( // 全局互斥锁 randomLock sync.Mutex // 全局随机数生成器 randomGen *rand.Rand ) func init() { // 在程序启动时初始化随机数生成器 // 并设置随机种子 randomGen = rand.New(rand.NewSource(time.Now().UnixNano())) } func main() { // 创建一个等待组来跟踪 goroutine var wg sync.WaitGroup // 启动 10 个 goroutine 生成 10 个随机数 for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { // 使用互斥锁保护随机数生成 randomLock.Lock() value := randomGen.Intn(100) randomLock.Unlock() // 打印生成的随机数 fmt.Printf("Goroutine %d: %d\n", i, value) wg.Done() }(i) } // 等待所有 goroutine 完成 wg.Wait() }
在这种方法中,使用了一个全局 randomLock
互斥锁来保护对 randomGen
sync.Mutex
) を使用できます。ミューテックスでは、一度に 1 つの goroutine のみがクリティカル セクション (この場合は rand.Rand
インスタンス) にアクセスできます。 🎜🎜次のコードは、ミューテックスを使用して乱数生成を同期する方法を示しています: 🎜rrreee🎜 このアプローチでは、グローバル randomLock
ミューテックスを使用して、randomGen
アクセスへのアクセスを保護します。乱数発生器に。各ゴルーチンは乱数を生成する前にミューテックスを取得し、生成後にミューテックスを解放します。これにより、一度に 1 つの goroutine だけが乱数ジェネレーターにアクセスできるようになり、データ競合が排除されます。 🎜🎜このようにして、並列処理で安全かつ確実に乱数を生成することができます。 🎜以上がGolangの並列処理で乱数生成を同期するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。