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
5package main
6
7import "runtime"
8
9func init() {
10	register("concurrentMapWrites", concurrentMapWrites)
11	register("concurrentMapReadWrite", concurrentMapReadWrite)
12	register("concurrentMapIterateWrite", concurrentMapIterateWrite)
13}
14
15func 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
36func 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
57func 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}
78