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.