如何创建一个线程安全的rand.Source?

时间:2018-02-24 02:54:39

标签: go random dependency-injection

标准库rand.NewSource函数的documentation表示

  

与顶级函数使用的默认Source不同,此源是   对于多个goroutine并发使用是不安全的。

有没有办法创建一个线程安全的rand.Source

上下文:我有一个类型,其方法可以由多个go-routines调用,并且此方法使用随机数。我想支持依赖注入测试,所以我不能使用默认的Source。

2 个答案:

答案 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 implementationlockedSource,但相关类型is not exported