diff options
author | Roger Peppe <rogpeppe@gmail.com> | 2009-12-09 12:55:19 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-12-09 12:55:19 -0800 |
commit | 916533119e4d952412d44ff9907691e8137cc0ef (patch) | |
tree | c39b9cb030195b60aba2235371f70b507a0056bc | |
parent | 3ca1b1d27f6bd72dac74ba9e696c002998e54ec5 (diff) | |
download | go-916533119e4d952412d44ff9907691e8137cc0ef.tar.gz go-916533119e4d952412d44ff9907691e8137cc0ef.zip |
Make the operations on the global rng thread safe.
R=r, rsc
CC=golang-dev
https://golang.org/cl/168041
-rw-r--r-- | src/pkg/rand/rand.go | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/pkg/rand/rand.go b/src/pkg/rand/rand.go index 68e6e2c203..0063e40594 100644 --- a/src/pkg/rand/rand.go +++ b/src/pkg/rand/rand.go @@ -5,6 +5,8 @@ // Package rand implements pseudo-random number generators. package rand +import "sync" + // A Source represents a source of uniformly-distributed // pseudo-random int64 values in the range [0, 1<<63). type Source interface { @@ -91,7 +93,7 @@ func (r *Rand) Perm(n int) []int { * Top-level convenience functions */ -var globalRand = New(NewSource(1)) +var globalRand = New(&lockedSource{src: NewSource(1)}) // Seed uses the provided seed value to initialize the generator to a deterministic state. func Seed(seed int64) { globalRand.Seed(seed) } @@ -148,3 +150,21 @@ func NormFloat64() float64 { return globalRand.NormFloat64() } // sample = ExpFloat64() / desiredRateParameter // func ExpFloat64() float64 { return globalRand.ExpFloat64() } + +type lockedSource struct { + lk sync.Mutex; + src Source; +} + +func (r *lockedSource) Int63() (n int64) { + r.lk.Lock(); + n = r.src.Int63(); + r.lk.Unlock(); + return; +} + +func (r *lockedSource) Seed(seed int64) { + r.lk.Lock(); + r.src.Seed(seed); + r.lk.Unlock(); +} |