You're going to need to provide more detail. Specifically, a minimal
reproducer. There is no obvious explanation for the race given what you've
already shown us so I suspect you've omitted an important fact.

On Sat, Jun 26, 2021 at 3:27 PM Rory Campbell-Lange <rory...@gmail.com>
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
>
> --
> 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/CAPQX7QR1Evk7BzKAxwq3GKH%3DgiNb4YVs_ap7Q%2BUVC_OByoty2w%40mail.gmail.com
> <https://groups.google.com/d/msgid/golang-nuts/CAPQX7QR1Evk7BzKAxwq3GKH%3DgiNb4YVs_ap7Q%2BUVC_OByoty2w%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>


-- 
Kurtis Rader
Caretaker of the exceptional canines Junior and Hank

-- 
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/CABx2%3DD9gQBBN_ckaThDAXspafqJ2_UNU2%3D0ORxtT5b6PYfnZaA%40mail.gmail.com.

Reply via email to