-
Notifications
You must be signed in to change notification settings - Fork 601
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Is uuid.NewV4() thread safe? #81
Comments
I don't believe func (g *rfc4122Generator) NewV4() (UUID, error) {
u := UUID{}
if _, err := g.rand.Read(u[:]); err != nil {
return Nil, err
}
u.SetVersion(V4)
u.SetVariant(VariantRFC4122)
return u, nil
} the you could wrap var uuidGenerator sync.Mutex
func NewV4() (uuid.UUID, error) {
uuidGenerator.Lock()
defer uuidGenerator.Unlock()
return uuid.NewV4()
} although using goroutines to generate UUIDs, perhaps using channels to queue requests & responses is the more idiomatic go way. |
Globals and thread-safety are only of concern if there are writes happening to the global (or more specifically, to some piece of shared data, globally-scoped-or-not) concurrently with reads. (Ie. a "global" or shared var that's read-only throughout run time after some initial writes at init time is fully benign.) Not seeing such a situation here: a never-EOF'ing read-only rand reader should be "safeish" to a first intuition to begin with. What sort of state might it have to protect, really? But to verify our first intuition, we check the linux/unix/bsd/plan9 impl and lookie, there is seemingly a mutex on the underlying Haven't checked the Win impl, but the stdlib authors should surely be consistent in the locking/synchronization semantics of impls across OSes here. Anyone concerned can skim over the sources just as easily as I demo'd above 😁 |
When I call uuid.NewV4() in multiple goroutine, I have some question:
P/s: sorry for my bad English
Thanks.
The text was updated successfully, but these errors were encountered: