github.com/go-darwin/sys@v0.0.0-20220510002607-68fd01f054ca/testdata/testprog/map.go (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import "runtime" 8 9 func init() { 10 register("concurrentMapWrites", concurrentMapWrites) 11 register("concurrentMapReadWrite", concurrentMapReadWrite) 12 register("concurrentMapIterateWrite", concurrentMapIterateWrite) 13 } 14 15 func concurrentMapWrites() { 16 m := map[int]int{} 17 c := make(chan struct{}) 18 go func() { 19 for i := 0; i < 10000; i++ { 20 m[5] = 0 21 runtime.Gosched() 22 } 23 c <- struct{}{} 24 }() 25 go func() { 26 for i := 0; i < 10000; i++ { 27 m[6] = 0 28 runtime.Gosched() 29 } 30 c <- struct{}{} 31 }() 32 <-c 33 <-c 34 } 35 36 func concurrentMapReadWrite() { 37 m := map[int]int{} 38 c := make(chan struct{}) 39 go func() { 40 for i := 0; i < 10000; i++ { 41 m[5] = 0 42 runtime.Gosched() 43 } 44 c <- struct{}{} 45 }() 46 go func() { 47 for i := 0; i < 10000; i++ { 48 _ = m[6] 49 runtime.Gosched() 50 } 51 c <- struct{}{} 52 }() 53 <-c 54 <-c 55 } 56 57 func concurrentMapIterateWrite() { 58 m := map[int]int{} 59 c := make(chan struct{}) 60 go func() { 61 for i := 0; i < 10000; i++ { 62 m[5] = 0 63 runtime.Gosched() 64 } 65 c <- struct{}{} 66 }() 67 go func() { 68 for i := 0; i < 10000; i++ { 69 for range m { 70 } 71 runtime.Gosched() 72 } 73 c <- struct{}{} 74 }() 75 <-c 76 <-c 77 }