最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 如何在 Golang 并行处理中同步随机数生成?

    在 go 并发编程中同步随机数生成:使用互斥锁 (sync.mutex) 控制对 rand.rand 随机数生成器的访问。每个 goroutine 在生成随机数前获取互斥锁,并在生成后释放互斥锁。这确保了同一时间只有一个 goroutine 可以访问随机数生成器,消除了数据争用。

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

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

    在 Go 并发编程中,有时需要跨多个 goroutine 生成随机数。如果不注意同步,这可能会导致竞争条件和不可预测的行为。

    并行随机数生成

    Go 提供了一个 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: %dn", i, value)
                wg.Done()
            }(i)
        }
    
        // 等待所有 goroutine 完成
        wg.Wait()
    }

    在这种方法中,使用了一个全局 randomLock 互斥锁来保护对 randomGen 随机数生成器的访问。每个 goroutine 在生成随机数之前都会获取互斥锁,并在生成后释放互斥锁。这确保了同一时间只有一个 goroutine可以访问随机数生成器,从而消除了数据争用。

    通过这种方式,可以在并行处理中安全可靠地生成随机数。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 如何在 Golang 并行处理中同步随机数生成?
    • 5会员总数(位)
    • 22375资源总数(个)
    • 770本周发布(个)
    • 77 今日发布(个)
    • 176稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情