>  기사  >  백엔드 개발  >  Golang 병렬 처리에서 난수 생성을 동기화하는 방법은 무엇입니까?

Golang 병렬 처리에서 난수 생성을 동기화하는 방법은 무엇입니까?

WBOY
WBOY원래의
2024-06-03 14:53:56353검색

Go 동시 프로그래밍의 동기화된 난수 생성: 뮤텍스(sync.Mutex)를 사용하여 rand.Rand 난수 생성기에 대한 액세스를 제어합니다. 각 고루틴은 난수를 생성하기 전에 뮤텍스를 획득하고 생성 후 뮤텍스를 해제합니다. 이렇게 하면 한 번에 하나의 고루틴만 난수 생성기에 액세스할 수 있어 데이터 경합이 제거됩니다.

如何在 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)을 사용할 수 있습니다. 뮤텍스를 사용하면 한 번에 하나의 고루틴만 임계 섹션(이 경우 rand.Rand 인스턴스)에 액세스할 수 있습니다. 🎜🎜다음 코드는 뮤텍스를 사용하여 난수 생성을 동기화하는 방법을 보여줍니다. 🎜rrreee🎜이 접근 방식에서는 전역 randomLock 뮤텍스를 사용하여 randomGen 액세스에 대한 액세스를 보호합니다. 난수 생성기에. 각 고루틴은 난수를 생성하기 전에 뮤텍스를 획득하고 생성 후 뮤텍스를 해제합니다. 이렇게 하면 한 번에 하나의 고루틴만 난수 생성기에 액세스할 수 있어 데이터 경합이 제거됩니다. 🎜🎜이러한 방식으로 병렬 처리에서 난수를 안전하고 안정적으로 생성할 수 있습니다. 🎜

위 내용은 Golang 병렬 처리에서 난수 생성을 동기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.