标准库rand.NewSource
函数的documentation表示
与顶级函数使用的默认Source不同,此源是 对于多个goroutine并发使用是不安全的。
有没有办法创建一个线程安全的rand.Source
?
上下文:我有一个类型,其方法可以由多个go-routines调用,并且此方法使用随机数。我想支持依赖注入测试,所以我不能使用默认的Source。
答案 0 :(得分:2)
通常使用sync.Mutex来确保不会同时访问一个或多个值。以下是如何使用sync.Mutex来保护rand.Source:
var s = rand.NewSource(seed)
var mu sync.Mutex
// lock/unlock when accessing source from a goroutine
mu.Lock()
i := s.Int63()
mu.Unlock(
rand.Rand不支持并发使用。如果应用程序使用rand.Source创建rand.Rand,则保护rand.Rand:
var r = rand.New(rand.NewSource(seed))
var mu sync.Mutex
// lock/unlock when accessing the rand from a goroutine
mu.Lock()
i := r.Int()
mu.Unlock()
用于保护rand.Rand的互斥锁也将保护rand.Source。
答案 1 :(得分:0)
经过一番调查,我了解到要走的路是用互斥锁来保护Source。标准库甚至是contains an implementation,lockedSource
,但相关类型is not exported。