I have one Golang structure shared between several goroutines. For concurrent access to structure members, there is mutex sync.RWMutex. Does a single goroutin call for a structural element, do I need protection from the mutex?
For example, in the code below, a single goroutine author accesses the shared.exclusiveCounter member without blocking protection. Is this correct / safe? Or is there a need for a mutec because the entire structure is drawn by several larynxes through a common index?
package main
import (
"fmt"
"sync"
"time"
)
func main() {
s := &shared{mutex: &sync.RWMutex{}}
readerDone := make(chan int)
writerDone := make(chan int)
go reader(s, readerDone)
go writer(s, writerDone)
<-readerDone
<-writerDone
}
type shared struct {
mutex *sync.RWMutex
sharedCounter int
exclusiveCounter int
}
func (s *shared) readCounter() int {
defer s.mutex.RUnlock()
s.mutex.RLock()
return s.sharedCounter
}
func (s *shared) setCounter(i int) {
defer s.mutex.Unlock()
s.mutex.Lock()
s.sharedCounter = i
}
func reader(s *shared, done chan<- int) {
for {
time.Sleep(2 * time.Second)
counter := s.readCounter()
fmt.Printf("reader: read counter=%d\n", counter)
if counter > 5 {
break
}
}
fmt.Printf("reader: exiting\n")
done <- 1
}
func writer(s *shared, done chan<- int) {
s.exclusiveCounter = 0
for {
time.Sleep(1 * time.Second)
s.exclusiveCounter++
fmt.Printf("writer: writing counter=%d\n", s.exclusiveCounter)
s.setCounter(s.exclusiveCounter)
if s.exclusiveCounter > 5 {
break
}
}
fmt.Printf("writer: exiting\n")
done <- 1
}
Run it on the playground