在 Go 並發程式設計中同步隨機數產生:使用互斥鎖 (sync.Mutex) 控制對 rand.Rand 隨機數產生器的存取。每個 goroutine 在產生隨機數前取得互斥鎖,並在產生後釋放互斥鎖。這確保了同一時間只有一個 goroutine 可以存取隨機數產生器,消除了資料爭用。
在 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: %d\n", i, value) wg.Done() }(i) } // 等待所有 goroutine 完成 wg.Wait() }
在這個方法中,使用了一個全域randomLock
互斥鎖來保護對randomGen
隨機數產生器的存取。每個 goroutine 在產生隨機數之前都會取得互斥鎖,並在產生後釋放互斥鎖。這確保了同一時間只有一個 goroutine可以存取隨機數產生器,從而消除了資料爭用。
透過這種方式,可以在平行處理中安全可靠地產生隨機數。
以上是如何在 Golang 平行處理中同步隨機數產生?的詳細內容。更多資訊請關注PHP中文網其他相關文章!