目次
Golangの並列処理で乱数生成を同期するにはどうすればよいですか?
並列乱数生成
使用互斥锁进行同步
ホームページ バックエンド開発 Golang Golangの並列処理で乱数生成を同期するにはどうすればよいですか?

Golangの並列処理で乱数生成を同期するにはどうすればよいですか?

Jun 03, 2024 pm 02:53 PM
golang rand

Go 同時プログラミングでの同期乱数生成: ミューテックス (sync.Mutex) を使用して、rand.Rand 乱数ジェネレーターへのアクセスを制御します。各ゴルーチンは乱数を生成する前にミューテックスを取得し、生成後にミューテックスを解放します。これにより、一度に 1 つの goroutine だけが乱数ジェネレーターにアクセスできるようになり、データ競合が排除されます。

如何在 Golang 并行处理中同步随机数生成?

Golangの並列処理で乱数生成を同期するにはどうすればよいですか?

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang データベース接続用の接続プールを構成するにはどうすればよいですか? Golang データベース接続用の接続プールを構成するにはどうすればよいですか? Jun 06, 2024 am 11:21 AM

Golang データベース接続用の接続プールを構成するにはどうすればよいですか?

Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Jun 06, 2024 pm 05:14 PM

Golang を使用してファイルを安全に読み書きするにはどうすればよいですか?

Golang と C++ の類似点と相違点 Golang と C++ の類似点と相違点 Jun 05, 2024 pm 06:12 PM

Golang と C++ の類似点と相違点

Golang フレームワーク アーキテクチャの学習曲線はどれくらい急ですか? Golang フレームワーク アーキテクチャの学習曲線はどれくらい急ですか? Jun 05, 2024 pm 06:59 PM

Golang フレームワーク アーキテクチャの学習曲線はどれくらい急ですか?

Golangでリストからランダムな要素を生成するにはどうすればよいですか? Golangでリストからランダムな要素を生成するにはどうすればよいですか? Jun 05, 2024 pm 04:28 PM

Golangでリストからランダムな要素を生成するにはどうすればよいですか?

golangフレームワークの長所と短所の比較 golangフレームワークの長所と短所の比較 Jun 05, 2024 pm 09:32 PM

golangフレームワークの長所と短所の比較

Golang フレームワークでのエラー処理のベスト プラクティスは何ですか? Golang フレームワークでのエラー処理のベスト プラクティスは何ですか? Jun 05, 2024 pm 10:39 PM

Golang フレームワークでのエラー処理のベスト プラクティスは何ですか?

golang フレームワーク ドキュメントの使用手順 golang フレームワーク ドキュメントの使用手順 Jun 05, 2024 pm 06:04 PM

golang フレームワーク ドキュメントの使用手順

See all articles