peterh
peterh

Reputation: 1

Do Mutexes need initialization in Go?

I am writing some thread-safe thingy in Go. I try to use Mutexes.

The example I've found here, seems to use the Mutexes without any initialization:

...
// essential part of the referred page
// (it is not my code, I know the pointer is unneeded here,
// it is the code of the referred site in the link - @peterh)

var mutex = &sync.Mutex{}
var readOps uint64 = 0
var writeOps uint64 = 0

for r := 0; r < 100; r++ {
    go func() {
        total := 0
        for {
            key := rand.Intn(5)
            mutex.Lock()
....

I am a little bit surprised. Is it real, that they don't need any initialization?

Upvotes: 16

Views: 15134

Answers (1)

Kenny Grant
Kenny Grant

Reputation: 9633

A mutex does not need initialization.

Also that could just be var mutex sync.Mutex, there's no need for a pointer, same for the int values, there's no need to set them to 0, so that example you found could be improved. In all these cases the zero value is fine.

See this bit of effective go:

https://golang.org/doc/effective_go.html#data

Since the memory returned by new is zeroed, it's helpful to arrange when designing your data structures that the zero value of each type can be used without further initialization. This means a user of the data structure can create one with new and get right to work. For example, the documentation for bytes.Buffer states that "the zero value for Buffer is an empty buffer ready to use." Similarly, sync.Mutex does not have an explicit constructor or Init method. Instead, the zero value for a sync.Mutex is defined to be an unlocked mutex.

Upvotes: 31

Related Questions