Try to use sync.RWMutex instead, you have more control when to read or
write.

Em sáb, 26 de jun de 2021 18:34, 'Dan Kortschak' via golang-nuts <
golang-nuts@googlegroups.com> escreveu:

> On Sat, 2021-06-26 at 23:26 +0100, Rory Campbell-Lange wrote:
> > I'm trying to work out why I have a data race problem (on go 1.15 and
> > 1.16).
> >
> > *SearchResults.Set is called from several goroutines. I am trying to
> > avoid concurrent access to its two maps using a mutex, but this isn't
> > working.
> >
> > 108 type SearchResults struct {
> > 109     Boxes map[string][]Box
> > 110     seen  map[string]bool
> > 111     sync.Mutex
> > 112 }
> > 113
> > 114 // Set adds a new box to the search results map
> > 115 func (s *SearchResults) Set(b Box) {
> > 116
> > 117     s.Lock()
> > 118     defer s.Unlock()
> > 119
> > 120     if _, ok := s.seen[b.BoxID]; ok { // race problem
> > 121         return
> > 122     }
> > 123
> > 124     if model := b.GetModel(); model != "" {
> > 125         s.Boxes[model] = append(s.Boxes[model], b) // race
> > problem
> > 126         s.seen[b.BoxID] = true // race problem
> > 127     }
> > 128 }
> >
> > The data race report from go run -race <program> shows
> >
> > ==================
> > WARNING: DATA RACE
> > Write at 0x00c000012e70 by goroutine 16:
> >   runtime.mapassign_faststr()
> >       /home/rory/bin/go/src/runtime/map_faststr.go:202 +0x0
> >   main.(*SearchResults).Set()
> >       /home/rory/src/go-cex/cexer.go:126 +0x345
> > ...
> > Previous read at 0x00c000012e70 by goroutine 8:
> >   runtime.mapaccess2_faststr()
> >       /home/rory/bin/go/src/runtime/map_faststr.go:107 +0x0
> >   main.(*SearchResults).Set()
> >       /home/rory/src/go-cex/cexer.go:120 +0xf6
> > ...
> > ==================
> > WARNING: DATA RACE
> > Read at 0x00c000012ea0 by goroutine 8:
> >   runtime.mapaccess1_faststr()
> >       /home/rory/bin/go/src/runtime/map_faststr.go:12 +0x0
> >   main.(*SearchResults).Set()
> >       /home/rory/src/go-cex/cexer.go:125 +0x195
> > ...
> > Previous write at 0x00c000012ea0 by goroutine 16:
> >   runtime.mapassign_faststr()
> >       /home/rory/bin/go/src/runtime/map_faststr.go:202 +0x0
> >   main.(*SearchResults).Set()
> >       /home/rory/src/go-cex/cexer.go:125 +0x2a7
> > ...
> >
> > Advice gratefully received.
> >
> > Rory
>
> It looks like the Box type is being mutated and read in more than one
> goroutine; you're protecting Set, but is the b value being used
> elsewhen?
>
> Dan
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/78204779089a2167f27992bad6894eaad9bd3575.camel%40kortschak.io
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CABjW-rx-azGuovo-tOhjgwT_J7CpVApac15XEvVth8PvPk3EpA%40mail.gmail.com.

Reply via email to